我将在页面底部发布正确的解决方案,以防有人勇敢(或绝望)阅读到这一点。
对于那些不想阅读所有文本的人来说,这里是 gitHub 存储库:resizableTextView
这适用于 iOs7(我相信它适用于 iOs8)和自动布局。你不需要幻数,禁用布局和类似的东西。简短而优雅的解决方案。
我认为,所有与约束相关的代码都应该转到updateConstraints
方法。所以,让我们自己制作ResizableTextView
.
我们在这里遇到的第一个问题是在方法之前不知道真实的内容大小viewDidLoad
。我们可以根据字体大小、换行符等来计算它。但是我们需要强大的解决方案,所以我们会这样做:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
所以现在我们知道真正的 contentSize 无论我们在哪里: before 或 after viewDidLoad
。现在在 textView 上添加高度约束(通过故事板或代码,无论如何)。我们将使用以下方法调整该值contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
最后要做的就是告诉超类到updateConstraints
.
[super updateConstraints];
现在我们的类看起来像:
可调整大小的TextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
漂亮干净,对吧?而且您不必在控制器中处理该代码!
可是等等!
没有动画!
您可以轻松地为更改设置动画以textView
平滑拉伸。这是一个例子:
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];