使用自动布局扩展为文本的UITextView
我有一个完全使用自动布局编程的视图。 我在视图的中间有一个UITextView,它上面和下面的项目。 一切工作正常,但我希望能够扩展UITextView作为文本添加。 当它扩展时,它应该把它下面的所有东西都推下来。
我知道如何做到这一点,“弹簧和支柱”的方式,但有没有这样做的自动布局方式? 我能想到的唯一方法是在每次需要增长时删除和重新添加约束。
包含UITextView的视图将通过AutoLayout的setBounds
分配其大小。 所以,这就是我所做的。 超级视图最初设置了所有其他约束条件,最后我为UITextView的高度放置了一个特殊约束条件,并将其保存在一个实例变量中。
_descriptionHeightConstraint = [NSLayoutConstraint constraintWithItem:_descriptionTextView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.f
constant:100];
[self addConstraint:_descriptionHeightConstraint];
在setBounds
方法中,我改变了常量的值。
-(void) setBounds:(CGRect)bounds
{
[super setBounds:bounds];
_descriptionTextView.frame = bounds;
CGSize descriptionSize = _descriptionTextView.contentSize;
[_descriptionHeightConstraint setConstant:descriptionSize.height];
[self layoutIfNeeded];
}
刚刚进入这个问题,我不知道我是否脱离主题,但是如果您将UITextView设置为“不”滚动:
[textView setScrollEnabled:NO];
它将能够计算内在尺寸,从而允许自动布局自行移动其他元素,然后由您自行设置约束条件。
(在iOS 7上)
UITextView不提供一个intrinsicContentSize,所以你需要继承它并提供一个。 要使其自动增长,请使layoutSubviews中的intrinsicContentSize无效。 如果您使用默认contentInset之外的任何内容(我不建议),您可能需要调整intrinsicContentSize计算。
@interface AutoTextView : UITextView
@end
#import "AutoTextView.h"
@implementation AutoTextView
- (void) layoutSubviews
{
[super layoutSubviews];
if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
[self invalidateIntrinsicContentSize];
}
}
- (CGSize)intrinsicContentSize
{
CGSize intrinsicContentSize = self.contentSize;
// iOS 7.0+
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;
}
@end
链接地址: http://www.djcxy.com/p/28281.html
上一篇: UITextView that expands to text using auto layout
下一篇: How do I adjust the anchor point of a CALayer, when Auto Layout is being used?