becomeFirstResponder 重置其他视图的 x/y 位置

Posted

技术标签:

【中文标题】becomeFirstResponder 重置其他视图的 x/y 位置【英文标题】:becomeFirstResponder resets x/y position of other views 【发布时间】:2015-03-02 21:18:38 【问题描述】:

我在两个 UITextFields 上做一些动画。当一个文本字段完成编辑后,我使用UIView.animateWithDuration 为左侧的第一个文本字段设置动画,并再次调用UIView.animateWithDuration 以显示第二个文本字段进行编辑。

问题是,当我在第二个文本字段上调用 ​​becomeFirstResponder() 时,它会还原第一个 ui 文本字段上的新 x/y 坐标。

怎么了?

编辑

提供的代码

func animateMe() 
    UIView.animateWithDuration(0.5, delay: 0, options: .CurveEaseOut, animations: 
        self.onText.frame.offset(dx: self.onText.frame.size.width / -4 * 3 - 10, dy: 0)
        , completion:  finished in
            println("one shown!")
            self.oneText.frame.offset(dx: self.onText.frame.size.width / -4 * 3 - 10, dy: 0)
            self.twoText.becomeFirstResponder() //undoes the whole animation
    )

【问题讨论】:

【参考方案1】:

在 UIView 动画方法的完成块中,将你的 UITextfield 的框架设置为目标新位置。 动画不会为你做这件事,这是违反直觉的,但解释太长了。

【讨论】:

不确定我是否按照你说的那样做......你会看到我的编辑吗?【参考方案2】:

如果您使用约束来创建原始位置,则可能会在弹出键盘时刷新布局,这会将您的文本框恢复到约束所说的位置。

如果是这种情况,您可能需要在 layoutSubviews 中设置文本字段最终帧。这样,您将继续覆盖默认布局。仅在应该折叠时才这样做,以便在应该折叠时弹回。

【讨论】:

我已经删除了文本字段中的所有约束,并且实际上禁用了键盘(模拟器),问题仍然存在 如果你在任何地方有任何约束,Xcode 会在幕后添加自动约束。我会添加 layoutSubviews 并只调用 super 但放置一个断点,以便您可以检测它是否被调用。 becomeFirstResponder 向文本字段询问输入视图和辅助视图,然后很可能会进行布局,无论您是否在模拟器中显示键盘。

以上是关于becomeFirstResponder 重置其他视图的 x/y 位置的主要内容,如果未能解决你的问题,请参考以下文章

应该总是在主线程上调用 becomeFirstResponder() 吗?

在 UITableViewController textfield.becomeFirstResponder() 中不滚动 tableview

becomeFirstResponder 在 iOS 8 中不起作用

在UITableViewController中textfield.becomeFirstResponder()不滚动tableview

取消隐藏视图时 becomeFirstResponder 会减慢应用程序的速度

_UIButtonBarStackView:当 becomeFirstResponder 发送时打破约束