设备旋转时更改自定义inputView的高度

use*_*781 6 uitextfield uikeyboard ios inputview

我创建了一个自定义键盘视图并将其链接到UITextField的inputView属性.当方向发生变化时,有没有办法改变自定义inputView的高度,并且像系统键盘一样平滑动画框架变得平滑?我的键盘尺寸是768x272,当设备走向横向时,尺寸变为1024x272,但我想让它变得像1024x372一样大.当我获得UIDeviceOrientationDidChangeNotification时,如果我使用下面的代码更改框架,则更改动画不平滑.

textField.inputView.frame = CGRectMake(0,0,1024,372);
Run Code Online (Sandbox Code Playgroud)

小智 6

针对UIResponder.inputView的每个Apple文档:"如果UIKit在其自动调整掩码中遇到带有UIViewAutoresizingFlexibleHeight值的输入视图,它会更改高度以匹配键盘."

因此,如果您想要自定义高度,则不应指定UIVieAutoresizingFlexibleHeight蒙版.


use*_*781 2

经过多次实验,我找到了自己问题的最佳答案。一个简短的答案是当你得到 时改变框架UIKeyboardDidHideNotification

自定义 inputView 嵌入到由系统控制的另一个视图中,称为UIPeripheralHostView. 因此,在错误的时间更改自定义 inputView 不会立即反映出来,或者充其量只能显示丑陋的布局。

当设备旋转时,系统会短暂隐藏键盘,然后执行键盘从旧方向到新方向的旋转动画。我认为动画块插入在两个通知UIKeyboardDidHideNotification和之间的某个位置UIKeyboardWillShowNotification。这些通知与UIKeyboardWillChangeFrameNotification. 本通知中的“框架”实际上是指的框架UIPeripheralHostView

因此,当我获得输入视图的框架时,系统有机会在动画开始之前UIKeyboardDidHideNotification调整框架,从而在方向更改期间从短键盘平滑过渡到高键盘。UIPeripheralHostView

这在 iOS 5 中有效。但苹果将来可能会改变这种做法。