2014-02-28 88 views
9

一个例子项目来演示以下问题文本可以在这里找到:https://github.com/markdorison/UITextFieldContentSizeExample/调整大小的UITextField水平与使用自动布局

我试图有一个的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}

任何帮助,将不胜感激!

+4

你有没有解决这个问题?我发现对于问题2,UITextField只有在焦点空时才能正确调整大小。如果字段中已有任何文本,instrinsicContentSize在UIControlEventEditingChanged上根本不会改变。 –

+1

@ChristopherCamps你刚刚救了我几个小时。感谢您的评论! –

+0

@Rudolf Adamkovic,你是如何解决它的? – gabbler

回答

6

我设置了一个占位符。然而,占位符的宽度,UITextField的intrinsicContentSize的宽度永远不会低于它。所以如果占位符的宽度是130,并且我开始键入,那么文本视图的宽度将保持为130,直到我输入的宽度超过130;在此之后,文本视图将会增长。

我认为你必须使用的UITextField子类,其中到达设定instrinsicContentSize,覆盖intrinsicContentSize方法,显然是大小根据占位符的默认行为。

+7

这是我找到的最好的/唯一的解决方案。特别用'return self.isEditing重写'intrinsicContentSize'? [super.text sizeWithAttributes:self.typingAttributes]:[super intrinsicContentSize];' –

+0

我将如何为UITextView执行此操作?似乎没有'intrinsicContentSize'方法。 –

+1

@KatedralPillon请勿通过评论劫持。如果你有问题,请把它作为_question_。 – matt

相关问题