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



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

在界面生成器中,我有一个文本为"__"的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;
}

奇怪的是

  • 如果我没有在textFieldShouldBeginEdition:中将文本设置为@",则文本字段不会动态调整的大小

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

在这两种情况下,当文本字段退出第一个响应程序时,最终会调整布局。

这是获得动态调整大小和居中文本字段的正确方法,还是破解?

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

-(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以保持其水平居中。或者你坚持自动布局,我只是不太喜欢。

从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,如果你尝试的话,请告诉我结果如何。

最新更新