animationUITextField子类的位置时文本跳转

当我animation我的UITextField子类的位置时,字段中的文本跳转到UITextField的位置,这是非常震惊,我不知道为什么会发生: 之前中中中结束

我的子类在文本字段的右侧添加一个button,当点击时调用视图控制器上的一个方法,该方法改变文本字段的边界颜色,并通过改变文本字段的顶部空间约束将文本字段移动到屏幕上,和上面的一些其他意见。

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

我解决这个问题。 改变你的代码到这个。 它会工作。

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

或如果这不起作用,而不是

 [self.view layoutSubviews]; 

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

编辑:

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

它看起来像是由于某种原因,你的用户界面在animation被触发之前没有处于稳定状态。

尝试添加对[self.view layoutIfNeeded];的调用[self.view layoutIfNeeded]; 在你的animation块之前,并使用[self.view layoutIfNeeded]; 在你的块的结尾,而不是[self.view layoutSubviews]; 这不应该在这方面真正使用。

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

Objective-C的:

  - (void)textFieldDidEndEditing:(UITextField *)textField { [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch //...other stuff } 

迅速:

  func textFieldDidEndEditing(_ textField: UITextField) { textField.layoutIfNeeded() //Fixes iOS 9 text bounce glitch //...other stuff } 

Google把我带到这里。 在@Mahesh Agrawal的回答下,@Andy评论了一个链接到这里的链接,这是我能find的最好的解决scheme。