【问题标题】:Text jumps when animating position of UITextField subclass动画 UITextField 子类的位置时文本跳转
【发布时间】:2015-08-14 20:31:41
【问题描述】:

当我为我的UITextField 子类的位置设置动画时,字段中的文本会与持有它的UITextField 的位置不同步,这非常不和谐,我不知道为什么会这样:

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

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

                     }];

【问题讨论】:

标签: ios objective-c iphone animation uitextfield


【解决方案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];

                 }];

或者如果这不起作用,那么代替

[self.view layoutSubviews];

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

编辑:

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

【讨论】:

  • 永远不要直接调用 -layoutSubviews。而是调用 -layoutIfNeeded。
  • 我已经尝试过 layoutIfNeeded 但它在 iOS 8 中不起作用。我这样做是因为 UITextField 由几个 UIControls 组成,其中一个是 UILabel 正在弹跳,如果我们做 layoutIfNeeded 我认为它没有根据需要更改其布局。请通过添加 layoutIfNeeded 来检查 iOS 8。它不起作用,这就是我认为发布这个问题的原因。但现在在 iOS 9 中它可能会起作用。我不确定。
  • 通常你会在 layoutIfNeeded 之前调用 setNeedsLayout 来告诉 UIKit 这个特定的视图需要更新布局。有一定的顺序和内部基础设施来处理更新并确保它们与旧的“弹簧和支柱”和自动布局一起正常工作。我这样做是因为它有效不是解释。如果您有更复杂的 UI 布局,您可能会在 UI 中造成更多的损坏和不一致。根据文档,无论您看到什么副作用,您都不应该手动调用 layoutSubviews,即使这样可以解决您的问题。 (很可能是暂时的)
  • 如果您想知道如何解决 iOS 9 的这个问题:stackoverflow.com/a/32996503/351305
  • 感谢您为我们指明了正确的方向。真的很感激。
【解决方案2】:

由于某种原因,您的 UI 在触发动画之前似乎没有处于稳定状态。

尝试在动画块之前添加对[self.view layoutIfNeeded]; 的调用,并在块的末尾使用[self.view layoutIfNeeded];,而不是[self.view layoutSubviews];,在这种情况下实际上不应该使用。

【讨论】:

    【解决方案3】:

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

    目标-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 设置了一个链接到Here 的链接,这是我能为这个问题找到的最佳解决方案。

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多