Iphone 在模态视图控制器中调用becomeFirstResponder时出现键盘动画问题

Iphone 在模态视图控制器中调用becomeFirstResponder时出现键盘动画问题,iphone,keyboard,modal-dialog,first-responder,Iphone,Keyboard,Modal Dialog,First Responder,我在调用-becomeFirstResponder时遇到了一些问题,该UITextField包含一个视图控制器,该视图控制器以模式显示。我在模态视图控制器的-viewDidLoad方法中调用此方法,以便立即显示键盘。我所期望的是键盘和模态视图控制器同时从屏幕底部向上设置动画。然而,我观察到的是: 在单击调用父视图控制器上的-presentModalViewController:animated:方法的按钮和子视图控制器开始以模态方式设置动画之间,存在约0.2秒的UI延迟 一旦模态视图控制器的动画

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

  • 在单击调用父视图控制器上的
    -presentModalViewController:animated:
    方法的按钮和子视图控制器开始以模态方式设置动画之间,存在约0.2秒的UI延迟
  • 一旦模态视图控制器的动画开始,键盘将立即显示绝对没有动画
  • 一旦模态视图控制器的动画完成,其他一切似乎都可以顺利运行
  • 禁用模态视图控制器会使其在屏幕外平滑地设置动画(巧合的是,它与键盘一起)
  • 在第一次之后的任何时间单击显示模态视图控制器的按钮都会产生相同的模式,只是没有~0.2秒的UI延迟
  • 这就好像键盘的动画和模态视图控制器的动画都在同时争夺一些较低级别的核心动画资源,但我不明白为什么会发生这种情况。似乎进一步证实这一预感的是,如果我不要求
    UITextField
    成为第一响应者(即,如果我不要求键盘显示自己),则绝对没有UI延迟,并且模态视图控制器会立即设置动画

    有趣的是,如果我使用object:nil afterDelay:0.0001执行类似于
    [self.textField performSelector:@selector(becomeFirstResponder)的操作
    然后键盘的动画几乎与modal view控制器的动画同时发生——在iPhone模拟器上运行时,很难判断它们不是同时动画的。但是,当在实际设备上运行时,很容易注意到,键盘直到出现模态视图控制器之后才会出现。不过,重要的是,没有更多的UI延迟


    有人经历过类似的情况吗?

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

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

    我认为您遇到了问题,因为您正在有效地堆叠动画。键盘视图包含在模态视图中。“键盘”视图试图在自身正在为幻灯片过渡设置动画的视图的上下文中为其幻灯片过渡设置动画。键盘动画试图击中移动的目标

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

    因此,“键盘”视图会设置自身滑动动画,但由于superview实际上还不可见,因此您什么也看不到。当superview滑入时,键盘已存在,因为其动画在superview开始动画之前完成

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


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

    这就是我所做的,使键盘显示为与modalviewcontroller完全相同的动画:


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

    延迟的键盘动画也困扰着我
    viewdilayoutsubviews
    是我一直在寻找的神奇方法。将
    becomeFirstResponder
    呼叫放在那里可以使键盘随着模式及时向上滑动


    该问题在设备和iPhone模拟器中都存在。这在iPhone模拟器上并不明显,因为它速度更快。您是否尝试过在动画中使用键盘的UIImageView来人工创建所需的外观?在配备iOS 9.3.2的iPhone 6s上,我对键盘的动画方式感到满意,但我在第一次从viewDidLoad呼叫becomeFirstResponder时也观察到了这种延迟。经过一些测试,我发现应用程序启动后的第一次键盘演示会被延迟,无论它是如何触发的。这个延迟只有在附加了调试器时才会发生。谢谢