动态调整UITextField大小同时保持文本输入为中心的正确方法是什么?

时间:2014-04-13 11:41:28

标签: ios ios7 uitextfield autolayout

给定一个文本字段,我希望它在用户键入文本时水平动态调整大小。我也希望它在其超级视图中保持中心。我偶然发现了这样做的方法,但这似乎是做作的,而且不太可能是正确的做法。我觉得我在这里遗漏了一些简单的东西,比如文本字段或控件的属性或我不熟悉的协议。

在Interface Builder中,我有一个带文本" __"的UITextField。它有两个约束,从顶部100个像素并垂直居中。 ViewController是文本字段的委托,而Editing Changed事件将发送到 textFieldAction:

- (IBAction)textFieldAction:(UITextField *)sender {
    NSString *s = sender.text;
    CGSize newSize = [sender sizeThatFits:CGSizeMake(MAXFLOAT, MAXFLOAT)];
    CGRect newFrame = sender.frame;
    newFrame.size = newSize;
    sender.frame = newFrame;
    sender.text = s;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    textField.text = @"";
    return YES;
}

奇怪的是

  • 如果我没有将文字设置为@""在 textFieldShouldBeginEditing:文本字段没有动态调整大小

  • 如果我没有重新分配 textFieldAction:中的文字,则文本字段会动态调整大小,但不会动态保持居中。

在这两种情况下,当文本字段重新响应第一响应者时,最终会调整布局。

这是获得动态调整大小和居中的文本字段或黑客的正确方法吗?

1 个答案:

答案 0 :(得分:1)

这对我来说似乎是一个黑客,但我现在无法测试我自己的建议。 如果我试图在用户输入期间保持文本字段居中,我会使用

-(BOOL)textField:(UITextField)shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
在UITextFieldDelegate协议中

并在那里进行计算。 当你在这里时,你也可以尝试[textfield sizeToFit]完全摆脱计算。

您还可以摆脱约束,只需设置textfield.center.x = [[UIScreen mainScreen] screensize].width / 2textfield.center.x = textfield.superview.center.x即可使其水平居中。或者你坚持使用autolayout,我只是不是那么大的粉丝。

来自textField的文档:shouldChangeCharactersInRange:replacementString:

Return Value:  
YES if the specified text range should be replaced; otherwise, NO to keep the old text.

Discussion:  
The text field calls this method whenever the user types a new character in the text field or deletes an existing character.`

所以一定要回YES,如果你尝试的话,请告诉我结果。