给定一个文本字段,我希望它在用户键入文本时动态地水平调整大小。我也希望它保持在它的超级视图的中心。我偶然发现了一种方法,但这似乎是人为的,不太可能是正确的方法。我觉得我错过了一些简单的东西,比如文本字段的属性、控件或一些我不熟悉的协议。
在界面生成器中,我有一个文本为"__"的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 / 2
或textfield.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,如果你尝试的话,请告诉我结果如何。