UITextField不会在重新聚焦上更改帧

时间:2012-11-04 19:19:57

标签: iphone objective-c ios uitextfield frame

我有一个特殊的问题。我有两个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作为其宽度 - 它只是不会在屏幕上显示。此外,此问题不适用于第二个文本字段。

有什么想法吗?提前谢谢......

1 个答案:

答案 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];
}