9

我一直在调用-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 滞后。

有没有人经历过类似的事情?

4

5 回答 5

4

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

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

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

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

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

于 2010-05-02T13:56:57.340 回答
2

延迟的键盘动画也困扰着我。viewDidLayoutSubviews是我一直在寻找的神奇方法。在becomeFirstResponder那里拨打电话会使键盘与模态一起及时向上滑动。

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

于 2014-05-09T17:07:34.953 回答
0

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

于 2010-04-28T14:05:45.683 回答
0

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

于 2010-04-28T23:03:03.293 回答
0

这就是我所做的,以使键盘看起来与 modalviewcontroller 的动画时间完全相同:

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

于 2011-12-30T07:07:23.420 回答