使用自动布局扩展为文本的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?