Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize UITextField horizontally with text using Auto Layout

An example project to demonstrate the below issue can be found here: https://github.com/markdorison/UITextFieldContentSizeExample/

I am attempting to have a UITextField grow/shrink its width with the text content it contains using Auto Layout. I have created leading and trailing constraints with a priority of 749 (as opposed to the default: 1000). I have also tried lowering the priority of these constraints all the way down to 1, but this does not seem to have a noticeable effect on the behavior.

constraints screenshot

By listening to the UIControlEventEditingChanged event, I am triggering a reset of the intrinsicContentSize:

- (IBAction)textFieldDidChange:(UITextField *)textField {
    [UIView animateWithDuration:0.1 animations: ^{
        [textField invalidateIntrinsicContentSize];
    }];
}

This approach almost works. There are two issues:

  1. I am setting a placeholder. However wide the placeholder is, the width of the UITextField's intrinsicContentSize will never drop below it. So if the placeholder's width is 130, and I begin to type, the text view's width will remain at 130 until what I am typing reaches a width greater than 130; after this the text view will grow.

  2. In my example I have placed a UITextView below the UITextField. When I type in the UITextField, its width grows as expected. I can then tap into the UITextView and edit the text. If I then go back and edit the UITextView, its width no longer grows/shrinks as expected. The values being returned by the UITextField's intrinsicContentSize property go from being standard-looking integers like {192, 28}, to {191.536, 27.959999}.

Any help would be appreciated!

like image 476
markdorison Avatar asked Feb 28 '14 21:02

markdorison


1 Answers

I am setting a placeholder. However wide the placeholder is, the width of the UITextField's intrinsicContentSize will never drop below it. So if the placeholder's width is 130, and I begin to type, the text view's width will remain at 130 until what I am typing reaches a width greater than 130; after this the text view will grow.

I think you'll have to use a UITextField subclass where you get to set the instrinsicContentSize, overriding the default behavior of the intrinsicContentSize method which is evidently to size based on the placeholder.

like image 133
matt Avatar answered Sep 22 '22 21:09

matt