ios - 更新 textFieldDidBeginEditing 方法中的约束会导致文本弹回

标签 ios uitextfield autolayout

我有一个 UIView,它包含另一个名为 contentViewUIView 对象。在 contentView 中,我有几个 UITextField 对象。为了使当前编辑的 UITextField 始终可见并且不会被键盘隐藏,我正在更改 textFieldDidBeginEditing:contentView 的约束:方法。这意味着 contentView 在父级 UIView 中上下滑动,并保持相关的 UITextField 可见。这部分工作正常,但这里有一个代码片段:

- (void)textFieldDidBeginEditing:(UITextField *)textField
    //offset calculation removed for clarity
    NSInteger offset = ....

    self.contentViewTopConstraint.constant = -offset;
    self.contentViewBottomConstraint.constant = offset;
    [self.view setNeedsUpdateConstraints];

    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}

我注意到,如果我在第一个 UITextField 中键入一些文本,然后点击第二个 UITextField,第一个 UITextField 中的文本code> 向上跳,然后再次向下跳。如果我在上面的代码片段中禁用动画,这种行为就会消失。所以我的猜测是,在编辑 UITextField 时,设置了一些其他约束,然后随着焦点从 UITextField 移开而改变。当我告诉 View 以动画方式更新它的约束时,这会导致文本四处移动。

有什么方法可以避免这种情况,但仍然保持上下移动 contentView 的动画?

编辑:在我更新任何约束之前添加一个额外的[self.view layoutIfNeeded] 调用解决了这个问题。我仍然不确定可能发生了什么,或者为什么会修复它。任何人都有任何见解?

最佳答案

从那以后,我了解到为约束设置动画的正确方法是这样的:

- (void)textFieldDidBeginEditing:(UITextField *)textField
    //offset calculation removed for clarity
    NSInteger offset = ....

    [self.view layoutIfNeeded];
    self.contentViewTopConstraint.constant = -offset;
    self.contentViewBottomConstraint.constant = offset;

    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}

这解决了我遇到的问题。

关于ios - 更新 textFieldDidBeginEditing 方法中的约束会导致文本弹回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29161006/

相关文章:

iOS Swift - 如何在应用程序中检测系统警报

ios - 为什么 UIBarButtonItems 最小尺寸时宽度为 0

来自主 UIViewController 的 IOS 模态视图

swift - UITextField 在输入之前显示 "Optional("")"

ios - 调整 UICollectionView 的大小以使其内容适合 AutoLayout View

objective-c - UIWindow 创建 NSAutoresizingMaskLayoutConstraints 而不是 NSLayoutConstraint

iphone - 等待键盘隐藏

ios - 使用 Storyboard从动态 TableView 自定义 Segue?

ios - 使用 UITextViews 作为 UITextFields

ios - WKWebView LayoutConstraints 问题