在动画UITextField子类的位置时文本跳转

时间:2015-06-01 11:38:48

标签: ios objective-c iphone animation uitextfield

当我为UITextField子类的位置设置动画时,字段中的文本与UITextField持有它的位置跳出一步,这非常刺耳,我无法弄清楚为什么会发生: before during during during end

我的子类在文本字段的右侧添加一个按钮,当点击时调用视图控制器上的方法,该方法更改文本字段边框颜色并通过更改顶部空间约束来移动文本字段。文本字段,以及位于其上方的其他几个视图。

[UIView animateWithDuration:0.3
                     animations:^{
                         self.tableViewBottomSpaceConstraint.constant = 0;
                         self.mainLabelHeightConstraint.constant = 0;
                         self.subLabelTopSpaceConstraint.constant = 0;
                         self.postCodeFieldTopSpaceConstraint.constant = 12;
                         [self.view layoutIfNeeded];

                     }];

3 个答案:

答案 0 :(得分:10)

我解决了这个问题。将您的代码更改为此。它会起作用。

a[,,1]

或者如果这不起作用则代替

[UIView animateWithDuration:0.3
                 animations:^{
                     self.tableViewBottomSpaceConstraint.constant = 0;
                     self.mainLabelHeightConstraint.constant = 0;
                     self.subLabelTopSpaceConstraint.constant = 0;
                     self.postCodeFieldTopSpaceConstraint.constant = 12;
                     [self.view layoutSubviews];

                 }];

使用文本字段和layoutSubviews的父视图。在我的情况下,这工作。我认为这个答案有资格获得赏金。感谢。

编辑:

我找到了原因。当我们尝试layoutIfNeeded时,它意味着它首先更改外部布局,然后更改其布局后更改UITextField的内部文本,因为我们没有强制更改该文本字段的所有子视图的布局。毕竟UITextField由UIView和Label以及其他基本元素组成。但是当我们尝试layoutSubviews同时改变所有子视图的布局时。这就是为什么弹跳消失了。

答案 1 :(得分:2)

由于某些原因,在动画被触发之前,你的UI并没有处于稳定状态。

尝试在动画片段之前添加对[self.view layoutIfNeeded];的调用,并在块的末尾使用[self.view layoutIfNeeded];而不是[self.view layoutSubviews];,这不应该在此上下文中使用

答案 2 :(得分:1)

对于iOS 9或更高版本,这解决了问题

<强>目标-C:

<input type="text" data-link="{validate activityCode:toInt required=true}">

<强>夫特:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
 }
谷歌把我带到了这里。根据@Mahesh Agrawal的回答,@ Andy评论了一个链接到Here的链接,这是我能找到的最佳解决方案。