我已经进行了子类化UITextView
以使其返回一个内在的内容大小,如下所示:
- (void) layoutSubviews
{
[super layoutSubviews];
if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
[self invalidateIntrinsicContentSize];
}
}
- (CGSize)intrinsicContentSize
{
/*
Intrinsic content size of a textview is UIViewNoIntrinsicMetric
We have to build what we want here: contentSize + textContainerInset should do the trick
*/
CGSize intrinsicContentSize = self.contentSize;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
intrinsicContentSize.width += (self.textContainerInset.left + self.textContainerInset.right ) / 2.0f;
intrinsicContentSize.height += (self.textContainerInset.top + self.textContainerInset.bottom) / 2.0f;
}
return intrinsicContentSize;
}
我已经添加了一个观察者UITextViewTextDidChangeNotification
,当文本视图内容发生变化时,我会更新它的高度以使其随着文本高度的增长而增长:
- (void)textViewTextDidChangeNotification:(NSNotification *)notification
{
UITextView *textView = (UITextView *)notification.object;
[self.view layoutIfNeeded];
void (^animationBlock)() = ^
{
self.messageInputViewHeightConstraint.constant = MAX(0, self.messageInputView.intrinsicContentSize.height);
[self.view layoutIfNeeded];
};
[UIView animateWithDuration:0.3
delay:0
options:UIViewAnimationOptionCurveEaseInOut
animations:animationBlock
completion:nil];
}
但是当它们的行数足以填充文本视图高度时,在添加新行的一半时间中,UITextView 的 NSTextContainer 并没有很好地放置,就像你在这张图片中看到的那样
(NSTextContainer 用红色标出,UITextView 用蓝色标出)在
添加新行的另一半时间,NSTextContainer 被正确替换。
我没有找到如何解决这种奇怪的行为。
我希望你们中的一个人有一个解决它的答案。
谢谢