【问题标题】:Keyboard Animation Issues When Calling becomeFirstResponder within a Modal View Controller在模态视图控制器中调用 becomeFirstResponder 时的键盘动画问题
【发布时间】:2011-01-31 12:49:28
【问题描述】:

我在调用UITextField 上的-becomeFirstResponder 时遇到了一些问题,该UITextField 包含以模态显示的视图控制器。我在模态视图控制器的-viewDidLoad 方法中调用此方法,以便立即显示键盘。我期望键盘和模态视图控制器同时从屏幕底部开始动画。但是,我观察到的是以下内容:

  1. 在单击父视图控制器上调用 -presentModalViewController:animated: 方法的按钮与子视图控制器开始以模态方式设置动画之间存在约 0.2 秒的 UI 延迟。
  2. 模态视图控制器的动画一开始,键盘就会立即呈现,完全没有动画。
  3. 一旦模态视图控制器的动画完成,其他一切似乎都可以顺利运行。
  4. 关闭模态视图控制器会导致它在屏幕外平滑地进行动画处理(巧合的是,与键盘一起)。
  5. 在第一次之后的任何时间单击显示模态视图控制器的按钮都会导致相同的模式,除了没有 ~0.2 秒的 UI 延迟。

就好像键盘的动画和模态视图控制器的动画同时在竞争一些较低级别的核心动画资源,但我不明白为什么会发生这种情况。似乎进一步证实了这种预感的是,如果我不要求 UITextField 成为第一响应者(即,如果我不要求键盘呈现自己),那么绝对没有 UI 滞后,并且模态视图控制器立即动画。

有趣的是,如果我执行[self.textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0001]; 之类的操作,那么键盘的动画几乎与模态视图控制器的动画同时发生——很难说它们不是完全相同的动画在 iPhone 模拟器上运行时的时间。但是,当在实际设备上运行时,很容易注意到键盘直到模态视图控制器出现后才会出现。但重要的是,不再有 UI 延迟。

有没有人遇到过类似的情况?

【问题讨论】:

  • 您是否尝试过在动画中使用键盘的 UIImageView 来人为地创建想要的外观?
  • 在装有 iOS 9.3.2 的 iPhone 6s 上,我对键盘的动画方式很满意,但我第一次从 viewDidLoad 调用 becomeFirstResponder 时也观察到了这种延迟。经过一些测试,我发现应用程序启动后的第一个键盘演示会延迟,无论它是如何触发的。并且这种延迟仅在附加调试器时发生。

标签: iphone keyboard modal-dialog first-responder


【解决方案1】:

我相信您遇到了问题,因为您正在有效地堆叠动画。键盘视图包含在模态视图中。键盘视图试图在一个视图的上下文中为其转换中的幻灯片设置动画,该视图本身正在为转换中的幻灯片设置动画。键盘动画试图击中一个移动的目标。

暂停很可能是键盘过渡动画的运行时间。我相当确定键盘动画从其他动画中抢占了优先级,以便它可以驱动 UI 的重新排列,例如滚动表格以使键盘不会覆盖已编辑的表格行。在任何情况下,键盘动画都发生在超级视图的上下文中。在模态视图的情况下尤其如此。

因此,键盘视图会自动滑入,但由于超级视图实际上还不可见,因此您什么也看不到。当 superview 滑入时,键盘已经存在,因为它的动画在 superview 开始动画之前完成。

简而言之,我认为您无法真正完成您想做的事情。相反,我认为您必须首先为模态视图转换设置动画,然后运行键盘动画,否则您将不得不接受让键盘立即可见。

我认为上面 Cirrostratus 的建议是一个很好的建议。使用将在模态视图中滑入的键盘图像,然后立即将其与真实键盘交换。

【讨论】:

  • 感谢您的回答。我也有同样的怀疑,但我想确保我不只是疯了。 Cirrostratus 建议的问题是,一旦文本字段成为第一响应者,键盘仍会激活。这看起来很奇怪,因为已经存在的图像给人一种键盘存在的错觉。如果有一种方法可以在不设置动画的情况下立即呈现键盘,那就没有问题了。我会想办法弄清楚的。谢谢!
【解决方案2】:

延迟的键盘动画也困扰着我。 viewDidLayoutSubviews 是我一直在寻找的神奇方法。在那里调用becomeFirstResponder 会使键盘随着模态框及时向上滑动。

https://stackoverflow.com/a/19517739/3618864

【讨论】:

    【解决方案3】:

    尝试将发送 becomeFirstResponder 的代码从 viewDidLoad 移到 viewWillAppear。我认为它开始得太早了,您希望在视图出现动画发生时发生键盘动画。

    【讨论】:

      【解决方案4】:

      您是说您在模拟器上看到了延迟,但在设备上却没有?如果是这种情况,您可能会看到延迟,因为您的计算机需要时间将所有内容加载到内存中。第一次加载模拟器时,它不仅仅是在本地运行代码,它可能会加载各种运行时和调试库。一旦加载到内存中,系统可能会相当快。如果您在模拟器上遇到延迟,那么您的开发机器中的更多 RAM 可能会有所帮助。如果您的机器已经使用了几年,您可能会考虑购买新的东西。

      【讨论】:

      • 设备和 iPhone 模拟器中都存在此问题。这在 iPhone 模拟器上并不那么明显,因为它更快。
      【解决方案5】:

      这就是我所做的,以使键盘看起来与模态视图控制器的动画时间完全相同:

      在模态显示的视图的 (init) 方法中,我创建了 UITextField 并使其成为第一响应者。然后,当我用动画呈现模态视图控制器时,它们会同时出现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多