我会在页面底部发布正确的解决方案,以防有人胆怯(或感到绝望)来阅读这一点。
这是那些不想阅读所有文本的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];
现在我们的班级看起来像:
ResizableTextView.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];