有一个传统的UISplitViewController
iPad应用程序,使用presentViewController从"右侧"VC窗格显示模态视图:animated:completion:modalPresentationStyle
设置为UIModalPresentationFormSheet
.在viewDidAppear
模态视图的VC中,我们在a上调用了becomeFirstResponder UITextField
.在iOS6中,这会导致中心模态视图从底部向上滑动,然后聚焦KB.但是,从iOS7开始,出现的情况是视图从底部向上滑动后,向右滑动约(估计)200点.奇怪的是,如果你关闭键盘,一旦你这样做,视图就会像在iOS6上那样滑回到它的居中位置.从那时起,当模态视图启动时,KB焦点会使其保持居中并且仅向上滑动一点,这对于非全屏模式视图来说是正常的iOS行为.这就像一旦你从那时"纠正"自己就解雇了KB.我做了实验,发现:
如果您animated
为presentViewController
呼叫设置为NO,则其工作方式与iOS6类似.
如果你根本不打电话becomeFirstResponder
,它就像iOS6一样.
如果你打电话performSelector:xxxxafterDelay:0
,becomeFirstResponder
作为选择器而不是becomeFirstResponder
直接调用,它也像iOS6一样工作.
上面的选项3目前是我的前进解决方法,但我的问题是:这是一个iOS7错误,还是我们做错了,显然可以在6但在iOS7中没有?
仅在iOS7之后发生.仅在模拟器上重新创建一次,但在测试设备(iPad mini)上只有100%的时间.从搜索结果中我已经完成了当前最好的猜测(假设我们的代码不是责怪后iOS7),键盘的动画与iOS UI层底部向上滑动的视图之间存在竞争条件类型错误这会导致视图向右移动而不是向上移动,就像通常在模式显示非全屏视图并弹出KB时一样.在阅读了类似的SO问题后,我得到了这个理论.
有这个问题.这绝对是iOS7.X中的一个错误.(您应该向Apple打开错误报告!).Apple会在布局计算中出现错误并转换模态显示的视图.
我们用了
dispatch_async(dispatch_get_main_queue(), ^{ [view becomeFirstResponder]; });
克服这个问题,这与你的#3类似.这会延迟键盘外观,直到视图布局之后,克服了问题.