It seems UITextView's
contentSize
property is not correctly set in iOS 7 till viewDidAppear:
. This is probably because NSLayoutManager
lays out the text lazily and the entire text must be laid out for contentSize
to be correct. The ensureLayoutForTextContainer:
method forces layout of the provided text container after which usedRectForTextContainer:
can be used for getting the bounds. In order to get total width and height correctly, textContainerInset
property must be taken into account. The following method worked for me.
- (CGRect)contentSizeRectForTextView:(UITextView *)textView
{
[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
CGRect textBounds = [textView.layoutManager usedRectForTextContainer:textView.textContainer];
CGFloat width = (CGFloat)ceil(textBounds.size.width + textView.textContainerInset.left + textView.textContainerInset.right);
CGFloat height = (CGFloat)ceil(textBounds.size.height + textView.textContainerInset.top + textView.textContainerInset.bottom);
return CGRectMake(0, 0, width, height);
}
Additionally, it seems UITextView's
setContentSize:
method is called from layoutSubviews
. So, calling layoutIfNeeded
on a textView
(which itself calls layoutSubviews
) after calling ensureLayoutForTextContainer:
on its layoutManager
, should make the textView's
contentSize
correct.
[someTextView.layoutManager ensureLayoutForTextContainer:someTextView.textContainer];
[someTextView layoutIfNeeded];
// someTextView.contentSize should now have correct value
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…