键盘"WillShow"和"WillHide"与旋转

Voo*_*obr 23 iphone keyboard ipad autorotate ios

我有一个视图控制器监听UIKeyboardWillShowNotification和UIKeyboardWillHideNotification.这些通知的处理程序调整视图的各个部分,这是标准过程.

以下代码用于从屏幕坐标转换键盘rect:

CGRect keyboardBounds = [self.view convertRect:[keyboardBoundsValue CGRectValue] fromView:nil];
Run Code Online (Sandbox Code Playgroud)

再次,标准程序.不幸的是,存在这种转换失败的严重情况.看看在部署键盘时iPhone从纵向旋转到横向时会发生什么:

1)iOS自动触发UIKeyboardWillHideNotification ; self.interfaceOrientation报告为肖像 ; keyboardBounds.height是216.0.这是有道理的.为什么?因为在视图切换到横向模式之前,通知处理程序有机会"清理".

2)iOS自动触发UIKeyboardWillShowNotification ; self.interfaceOrientation报告为肖像 ; keyboardBounds.height是480.0.这没有意义.为什么不?因为通知处理程序将完成它的工作,认为键盘的高度是480.0!

苹果公司是否放弃了这个,或者我做错了什么?

请注意,倾听UIKeyboard而不是 ShowNoification不是有效的解决方案,因为它会显着降低用户体验.为什么?因为在键盘部署动画发生后动画我对视图的更改是...好吧,非常可怕.

键盘部署后,有没有人设法让自动旋转完美运行?Apple似乎完全忽略了混乱的爆发.>:|

PaR*_*Nos 55

也许有点晚了,但我遇到了同样的问题并且有一个很好的解决方案可以避免任何类型的工作(当然除非苹果改变事物)

基本上,当通知中心调用您的方法UIKeyboardWillShowNotification(或任何其他通知)时,它为您提供的框架UIKeyboardFrameBeginUserInfoKey位于窗口的上下文中,而不是您的视图.这个问题是,无论设备方向如何,窗口坐标系统始终都是纵向的,因此您可以找到错误的圆形宽度和高度.

如果您想避免解决问题,只需将矩形转换为视图的坐标系(根据方向进行更改).为此,请执行以下操作:

- (void) keyboardWillShow:(NSNotification *)aNotification
{
     CGRect keyboardFrame = [[[aNotification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    CGRect convertedFrame = [self.view convertRect:keyboardFrame fromView:self.view.window];

    ......
    /* Do whatever you want now with the new frame.
     * The width and height will actually be correct now
     */
    ......
}
Run Code Online (Sandbox Code Playgroud)

希望这应该是你所追求的:)

  • 非常感谢!似乎颠倒旋转的UIKeyboardFrameBeginUserInfoKey返回{0,0}个起源. (2认同)