【发布时间】:2014-04-13 11:41:28
【问题描述】:
给定一个文本字段,我希望它在用户输入文本时水平动态调整大小。我还希望它保持在其超级视图的中心。我偶然发现了一种方法来做到这一点,但它似乎是做作的,不太可能是正确的方法。我觉得我在这里遗漏了一些简单的东西,例如文本字段或控件的属性或我不熟悉的某些协议。
在 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: 中的文本,则文本字段会动态调整大小但不会动态保持居中。
在这两种情况下,最终都会在文本字段退出第一响应者时调整布局。
这是获得动态调整大小和居中文本字段的正确方法,还是 hack?
【问题讨论】:
-
你能设置一些断点或日志并确定这些方法被调用的顺序吗?最具体地说,是 textViewAction: 在您点击文本字段时调用一次还是两次?如果两次,谁是发件人?
-
textFieldAction: 每次按键调用一次。发件人是文本字段。 textFieldShouldBeginEditing:在我点击 textField 时调用,textFieldAction:每次点击时调用一次,textFieldShouldReturn:在我点击“return”时调用。
-
经过更多实验,似乎 textFieldShouldBeginEditing: 只需要一行:
sender.text = sender.text;重新分配字符串是必要的,但也足够了。 hack 看起来很有吸引力。
标签: ios ios7 uitextfield autolayout