使用自动布局调整UITextField水平大小以适应文本

9
以下是翻译的结果:

这里有一个示例项目,用于演示下面的问题: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. 在我的示例中,我在UITextView下方放置了一个UITextField。当我在UITextField中输入时,它的宽度按预期增长。然后我可以点击UITextView并编辑文本。如果我再回去编辑UITextView,则其宽度不再像预期那样增长/缩小。UITextField的intrinsicContentSize属性返回的值从标准整数变成了类似 {191.536, 27.959999} 这样的浮点数。

如有帮助,将不胜感激!


5
你解决过这个问题吗? 我发现对于第2个问题,只有在UITextField在聚焦时为空时,它才能正确调整大小。 如果字段中已经有任何文本,则在UIControlEventEditingChanged上,intrinsicContentSize根本不会改变。 - Christopher Camps
1
@ChristopherCamps,你刚刚为我节省了几个小时。感谢你的评论! - Rudolf Adamkovič
@Rudolf Adamkovic,你是怎么解决它的? - gabbler
1个回答

6
我正在设置一个占位符。无论占位符有多宽,UITextField的intrinsicContentSize的宽度都不会低于它。所以如果占位符的宽度为130,我开始输入后,文本视图的宽度将保持在130,直到我输入的内容超过130的宽度;之后文本视图将会增长。
我认为你需要使用一个UITextField子类,在其中你可以设置instrinsicContentSize,覆盖intrinsicContentSize方法的默认行为,该默认行为显然是基于占位符进行大小调整。

7
这是我找到的最好/唯一的解决方案。具体来说,通过使用return self.isEditing ? [super.text sizeWithAttributes:self.typingAttributes] : [super intrinsicContentSize];覆盖intrinsicContentSize - gyratory circus
我该如何在UITextView中实现这个功能?似乎没有intrinsicContentSize方法。 - Katedral Pillon
1
@KatedralPillon 请不要通过评论劫持。如果您有问题,请将其作为问题提出。 - matt
我刚刚提了一个问题:http://stackoverflow.com/questions/28129799/resize-uitextview-vertically-with-text-using-autolayout - Katedral Pillon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接