UIView inputView 与 inputViewController

UIView inputView vs inputViewController

在 iOS7 或更早版本中,我可以简单地设置 UIViewinputView 属性,以便在我的应用程序中实现自定义键盘。当设备旋转时,我只需将 inputView 的框架高度重置为横向或纵向键盘的高度,键盘高度就会正确更新。

在iOS8中,这一切都被打破了。对 inputView 框架的更改将被忽略。我试过调整 inputView 的自动调整掩码和自动布局约束,但这些在其他方面也失败了。

现在是否需要继承 UIInputViewControllerUIInputView 以实现自定义键盘(即使它不是系统范围的键盘)?我在 Apple 的文档中找不到任何支持这一点的内容,但看起来可能是这样。

键盘高度问题是一个 iOS8 错误,子类化 UIInputViewController 不会修复它。 UIInputViewController 的目的仅仅是为了做系统范围的键盘,正如 Apple 所说 here,如果你只是为自己的应用程序做自定义键盘,你不应该使用它。

Make sure a custom, systemwide keyboard is indeed what you want to develop. To provide a fully custom keyboard for just your app or to supplement the system keyboard with custom keys in just your app, the iOS SDK provides other, better options. Read about custom input views and input accessory views in Custom Views for Data Input in Text Programming Guide for iOS.

最终,我被迫开发自己的 iOS8 解决方案,放弃 iOS 系统键盘并通过创建自己的键盘视图结构构建模仿系统键盘的结构,为其设置动画in/out,编写自定义代码以响应通常会关闭键盘的系统事件,等等。对于 Apple 来说,允许进入 iOS8 是一个非常可怕且代价高昂的错误,尤其是当自定义键盘应该是iOS8.

中最伟大的新事物之一

Is it now required to subclass UIInputViewController and UIInputView in order to implement a custom keyboard (even when it's not a system-wide keyboard)?

我不知道它是否是必需的,但如果您打算在您的应用程序中制作自定义键盘,当然建议将 UIInputViewController 子类化。事实上,如果您打算进行键盘扩展,Apple 建议将此作为第一步:首先将其作为内部键盘并以该形式进行测试,然后如果您愿意,可以轻松地将其迁移到键盘扩展中。

在那种情况下,你不是子类 UIInputView;您使用输入视图控制器提供的输入视图。

这完全解决了您遇到的问题,因为视图控制器是一个视图控制器并且获取与旋转和布局相关的标准视图控制器事件。此外,可以使用自动布局约束在内部布局输入视图,以便在调整键盘大小时布局保持一致。