我有一个特殊的问题。我有两个UITextField的视图,开始宽280px。在焦点上,我希望它们缩短以显示一个按钮 - 我正在使用以下代码执行此操作:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect revealButton = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 221, textField.frame.size.height);
[UIView beginAnimations:nil context:nil];
textField.frame = revealButton;
[UIView commitAnimations];
NSLog(@"%f",textField.frame.size.width);
}
编辑结束后,他们应该回到原来的框架:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect hideButton = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 280, textField.frame.size.height);
[UIView beginAnimations:nil context:nil];
textField.frame = hideButton;
[UIView commitAnimations];
}
我第一次聚焦文本字段时,效果很好。但是,如果我在聚焦其他东西之后聚焦第一个文本字段(例如,如果我最初聚焦第一个文本字段,则聚焦第二个,然后重新聚焦第一个,或者如果我最初聚焦第二个然后聚焦第一个),它根本不会改变它的框架。更令人费解的是,将记录221作为其宽度 - 它只是不会在屏幕上显示。此外,此问题不适用于第二个文本字段。
有什么想法吗?提前谢谢......
答案 0 :(得分:1)
这很奇怪,我使用完全相同代码的两个文本字段进行快速测试并且每次都有效。
我建议删除文本字段和连接并重建它们。清理所有目标,然后重试。
根据您的评论进行修改:
如果您使用的是自动布局,则不得直接修改文本字段的框架。 UI元素的实际帧由系统计算。
出于您的目的,我建议为每个文本字段设置宽度约束。除了宽度约束之外,请确保只有左或右边距约束。要使其动画,请使用以下代码:
- (NSLayoutConstraint *)widthConstraintForView:(UIView *)view
{
NSLayoutConstraint *widthConstraint = nil;
for (NSLayoutConstraint *constraint in textField.constraints)
{
if (constraint.firstAttribute == NSLayoutAttributeWidth)
widthConstraint = constraint;
}
return widthConstraint;
}
- (void)animateConstraint:(NSLayoutConstraint *)constraint toNewConstant:(float)newConstant withDuration:(float)duration
{
[self.view layoutIfNeeded];
[UIView animateWithDuration:duration animations:^{
constraint.constant = newConstant;
[self.view layoutIfNeeded];
}];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
float newWidth = 221.0f;
NSLayoutConstraint *widthConstraint = [self widthConstraintForView:textField];
[self animateConstraint:widthConstraint toNewConstant:newWidth withDuration:0.5f];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
float newWidth = 280.0f;
NSLayoutConstraint *widthConstraint = [self widthConstraintForView:textField];
[self animateConstraint:widthConstraint toNewConstant:newWidth withDuration:0.5f];
}