我有一个 View Controller 监听 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification。这些通知的处理程序调整 View 的各个部分,这是标准程序。
以下代码用于从屏幕坐标转换键盘矩形:
CGRect keyboardBounds = [self.view convertRect:[keyboardBoundsValue CGRectValue] fromView:nil];
同样,标准程序。不幸的是,在这种转换失败的危急情况下。看看在部署键盘时将 iPhone 从纵向旋转到横向时会发生什么:
1) iOS 自动触发 UIKeyboardWillHideNotification; self.interfaceOrientation 报告为纵向; keyboardBounds.height 是 216.0。 这是有道理的。为什么?因为通知处理程序有机会在 View 切换到横向模式之前“清理”。
2) iOS 自动触发 UIKeyboardWillShowNotification; self.interfaceOrientation 报告为纵向; keyboardBounds.height 是 480.0。 这没有意义。为什么不?因为通知处理程序将认为键盘的高度是 480.0 来完成它的工作!
是 Apple 搞砸了还是我做错了什么?
请注意,改为监听 UIKeyboardDidShowNotification 不是有效的解决方案,因为它会显着降低用户体验。为什么?因为在键盘部署动画发生后动画我对 View 的更改是......好吧,看起来非常糟糕。
有没有人设法在部署键盘时让自动旋转完美地工作?这似乎是一场被苹果公司完全忽视的困惑爆炸。 >:|
最佳答案
也许有点晚了,但我刚刚遇到了同样的问题并且有一个很好的解决方案可以避免任何类型的变通(当然除非苹果改变了事情)
基本上,当通知中心为 UIKeyboardWillShowNotification
(或任何其他通知)调用您的方法时,它为您提供的 UIKeyboardFrameBeginUserInfoKey
框架位于窗口,而不是您的 View 。这个问题是,无论设备方向如何,Windows 坐标系始终是纵向的,因此您发现宽度和高度是错误的。
如果您想避免变通,只需将矩形转换为您 View 的坐标系(它会根据方向发生变化)。为此,请执行以下操作:
- (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
*/
......
}
希望这就是您想要的:)
关于iphone - 键盘 "WillShow"和 "WillHide"与旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746417/