Search code examples
iosuitextviewautolayoutnslayoutconstraint

UITextView that expands to text using auto layout


I have a view that is laid out completely using auto layout programmatically. I have a UITextView in the middle of the view with items above and below it. Everything works fine, but I want to be able to expand UITextView as text is added. This should push everything below it down as it expands.

I know how to do this the "springs and struts" way, but is there an auto layout way of doing this? The only way I can think of is by removing and re-adding the constraint every time it needs to grow.


Solution

  • The view containing UITextView will be assigned its size with setBounds by AutoLayout. So, this is what I did. The superview is initially set up all the other constraints as they should be, and in the end I put one special constraint for UITextView's height, and I saved it in an instance variable.

    _descriptionHeightConstraint = [NSLayoutConstraint constraintWithItem:_descriptionTextView
                                     attribute:NSLayoutAttributeHeight 
                                     relatedBy:NSLayoutRelationEqual 
                                        toItem:nil 
                                     attribute:NSLayoutAttributeNotAnAttribute 
                                    multiplier:0.f 
                                     constant:100];
    
    [self addConstraint:_descriptionHeightConstraint];
    

    In the setBounds method, I then changed the value of the constant.

    -(void) setBounds:(CGRect)bounds
    {
        [super setBounds:bounds];
    
        _descriptionTextView.frame = bounds;
        CGSize descriptionSize = _descriptionTextView.contentSize;
    
        [_descriptionHeightConstraint setConstant:descriptionSize.height];
    
        [self layoutIfNeeded];
    }