使用“自动布局”使用文本水平调整UITextField的大小

时间:2014-02-28 21:45:48

标签: cocoa-touch ios7 uitextfield autolayout

可以在此处找到演示以下问题的示例项目:https://github.com/markdorison/UITextFieldContentSizeExample/

我正在尝试让UITextField使用自动布局增加/缩小其包含的文本内容的宽度。我创建了优先级为749的前导和尾随约束(而不是默认值:1000)。我也尝试将这些约束的优先级一直降低到1,但这似乎对行为没有明显的影响。

constraints screenshot

通过监听UIControlEventEditingChanged事件,我触发了intrinsicContentSize的重置:

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

此方法几乎有效。有两个问题:

  1. 我正在设置一个占位符。无论占位符是多宽,UITextField的intrinsicContentSize的宽度都不会低于它。因此,如果占位符的宽度为130,并且我开始键入,则文本视图的宽度将保持为130,直到我输入的内容达到大于130的宽度;在此之后,文本视图将会增长。

  2. 在我的示例中,我在UITextField下面放置了一个UITextView。当我输入UITextField时,其宽度按预期增长。然后我可以点击UITextView并编辑文本。如果我然后返回并编辑UITextView,它的宽度不再按预期增长/缩小。 UITextField的intrinsicContentSize属性返回的值从标准外观整数(如{192, 28})变为{191.536, 27.959999}

  3. 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:6)

  

我正在设置一个占位符。无论占位符是多宽,UITextField的intrinsicContentSize的宽度都不会低于它。因此,如果占位符的宽度为130,并且我开始键入,则文本视图的宽度将保持为130,直到我输入的内容达到大于130的宽度;在此之后,文本视图将会增长。

我认为你必须使用一个UITextField子类,其中设置instrinsicContentSize,覆盖intrinsicContentSize方法的默认行为,显然是大小基于占位符。