Ios 什么';在输入文本时保持UITextField居中,动态调整UITextField大小的正确方法是什么?
给定一个textfield,我希望它在用户键入文本时动态调整水平大小。我还希望它在superview中保持居中。我偶然发现了一种方法,但它似乎是人为的,不太可能是正确的方法。我觉得这里缺少了一些简单的东西,比如文本字段的属性、控件或一些我不熟悉的协议 在Interface Builder中,我有一个UITextField,文本为“\”。它有两个约束,距顶部100像素,垂直居中。ViewController是textfield的代理,编辑更改事件被发送到textFieldAction:Ios 什么';在输入文本时保持UITextField居中,动态调整UITextField大小的正确方法是什么?,ios,ios7,uitextfield,autolayout,Ios,Ios7,Uitextfield,Autolayout,给定一个textfield,我希望它在用户键入文本时动态调整水平大小。我还希望它在superview中保持居中。我偶然发现了一种方法,但它似乎是人为的,不太可能是正确的方法。我觉得这里缺少了一些简单的东西,比如文本字段的属性、控件或一些我不熟悉的协议 在Interface Builder中,我有一个UITextField,文本为“\”。它有两个约束,距顶部100像素,垂直居中。ViewController是textfield的代理,编辑更改事件被发送到textFieldAction: - (IB
- (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;
}
奇怪的是
- 如果未在文本字段中将文本设置为@“”,则应开始编辑:文本字段不会动态调整大小
- 如果我没有在textFieldAction:中重新分配文本,则textfield会动态调整大小,但不会动态保持居中
这是获得动态调整大小和居中文本字段的正确方法,还是黑客攻击?对我来说,这似乎是黑客攻击,但我现在无法测试我自己的建议。 如果我试图在用户输入期间使文本字段居中,我会使用
-(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
,使其水平居中。或者你坚持使用autolayout,我只是没有那么喜欢它
从文本字段的文档中:shouldChangeCharactersRange: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,如果您尝试,请告诉我结果如何。谢谢,我刚刚尝试了您的建议,但使用textField:ShouldChangeCharactersRange:replacementString:的效果与使用操作几乎相同。如果文本字段中的文本字符串未设置为@“”,则应开始编辑并在文本字段中重新分配:ShouldChangeCharactersRange:replacementString:文本字段不会动态调整大小。顺便说一下,我尝试了您的建议,用sizeToFit替换帧大小调整计算,这是一种改进。谢谢。您能设置一些断点或日志并确定调用这些方法的顺序吗?最具体地说,当您点击textfield时,textViewAction:是调用一次还是两次?如果两次,谁是发送者?textFieldAction:为每次按键调用一次。发件人是文本字段。textFieldShouldBeginEditing:在我点击textField时调用,textFieldAction:在每次点击时调用一次,textFieldShouldReturn:在我点击“return”时调用。经过多次实验后,似乎textFieldShouldBeginEditing:只需要一行:
sender.text=sender.text代码>该字符串重新分配是必要的,但已足够。黑客看起来很有吸引力。