UISplitViewController在iPhone上出现键盘时调整应用程序内容的大小

时间:2016-08-11 19:54:15

标签: ios swift ios10

我的视图嵌套在SplitViewController内,而SplitViewController.preferedDisplayMode.primaryOverlay

当用户在水平紧凑的设备上调出键盘时,我的应用程序的整个内容视图会调整为仅包括键盘上方的区域和任何输入附件视图。

这与出现在内容上的键盘的预期行为相反(内容插入应用于滚动视图,因此用户可以看到重要的内容)。

通过旋转设备,此调整大小的行为消失了。实际上,在单次旋转之后,行为将不会再次发生,直到应用程序重新启动(即使您旋转回原始旋转)。

调试快照

这些照片是在iPhone上拍摄的,拆分视图为了清晰起见而折叠。

这里是旋转或键盘前内容的视图调试快照: before rotation without keyboard

这里是键盘出现后调整大小的内容的调试快照(调整大小的后面一个视图是我没有创建的UIPopoverView)。 请注意,键盘不在此快照中,因为iOS将键盘放在RemoteKeyboardWindowcontent resized by keyboard

这是一个调试快照,并在旋转到横向然后回到纵向和键盘后查看内容的调试快照(问题已经消失): content with keyboard correct after rotations

任何文字输入视图都会出现此问题。

这对我来说是一个奇怪的问题,所以如果有人以前见过或知道要采取的任何步骤,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

我通过this wonderful blog post about existing bugs in UISplitViewController找到了此问题的原因。

原因

当水平紧凑的环境请求properties.put("mail.smtp.ssl.trust", "smtp.gmail.com"); 样式时,会出现错误。该样式将覆盖物包裹在弹出窗口中,并且所有弹出窗口都会自动调整大小以避开键盘。由于水平紧凑的设备仅显示一个视图,因此将所有应用内容包装在调整大小的弹出窗口中。

事实证明.primaryOverlay具有未记录的行为,其中旋转设备会导致重新评估UISplitViewController属性。对于水平紧凑的设备,重新评估会将属性设置回preferedDisplayMode(或.automatic),这将停止在调整大小的弹出框中包装内容,从而解决问题。

答案

解决方案是在初始化和特征变化时根据设备特征手动设置.primaryHidden属性。

通过按如下方式对preferedDisplayMode进行子类化,我能够解决问题,同时维持iPad上的当前行为:

UISplitViewController