UIKeyboard采用无效帧

时间:2013-11-16 21:12:24

标签: ios iphone objective-c uikeyboard

我目前在屏幕底部有一个UICollectionView和一个UITextField。 textField根据键盘的框架移动(非常像inputAccessoryView,但我没有出于其他原因使用它),并且当键盘出现时,集合视图会修改其插图,非常标准的东西。

无论如何,屏幕上有一个按钮,按下时会显示一个覆盖整个屏幕的模态UIViewController,如果我的textField isFirstResponder,我会关闭键盘。

现在,当这个模态视图完成它的业务时,它会被解雇,我们回到集合视图和文本字段,但现在,集合视图有无限的插入,键盘不再显示。

我检查了UIKeyboardWillChangeFrameNotification的通知,这是userInfo:

Printing description of notification:
NSConcreteNotification 0x1ee4e900 {name = UIKeyboardWillChangeFrameNotification; userInfo =
{
    UIKeyboardAnimationCurveUserInfoKey = 0;
    UIKeyboardAnimationDurationUserInfoKey = "0.4";
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 1136}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{inf, inf}, {0, 0}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{inf, inf}, {0, 0}}";
}}

键盘即将显示为{{inf, inf}, {0, 0}}。我已经写了一张支票(用isInf)来防止这种情况,但是现在键盘被永久搞砸了,它不再出现在应用程序的任何地方,所以这已经成为一个严重的问题。这种情况发生在iOS6和iOS7上,模拟器和设备上。

我正在浏览所有代码,看看是否有任何导致问题的奇怪事件,但我希望有些人遇到类似问题,并对导致此问题的原因有所了解。

1 个答案:

答案 0 :(得分:0)

3个月后,我终于明白了(我一直在做其他事情,仅供参考)。

简短回答

确保你没有从任何旋转方法返回垃圾,否则键盘会转移到本地。

长版本

使用应用程序Reveal发现,它绘制了应用程序中每个图层的3d分解。我注意到键盘正在呈现,但它的框架是风景,当界面是纵向时。这立即让我修改了处理轮换的整个方式。

整个问题跨越来自具有复杂结构的子视图控制器的UIViewController,并且旋转调用将被手动转发给子节点。例如,这种方法:

- (NSUInteger)supportedInterfaceOrientations
{
    return [[[(id)self.selectedViewController viewControllers] lastObject] supportedInterfaceOrientations];
}

依赖当前所选导航控制器上的最顶层视图控制器来返回值。好吧,其中一个视图控制器变得流氓,它没有在这里返回任何东西,所以返回值必须只是内存中的任何内容或零。

解决方案现在检查视图控制器是否响应方法,如果没有,则默认为纵向(大约是应用程序的90%)。

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger supported = UIInterfaceOrientationMaskPortrait;
    UIViewController *viewController = [[(id)self.selectedViewController viewControllers] lastObject];

    if (viewController && [viewController respondsToSelector:@selector(supportedInterfaceOrientations)])
        supported = [viewController supportedInterfaceOrientations];

    return supported;
}
顺便说一下,理所当然的做法就是从YES(iOS 6,7)返回-(BOOL)shouldAutomaticallyForwardRotationMethods但是由于它是如何实现的,这是不可能的。目前,它位于NO并正在手动处理。

还有一个问题,为什么它只与呈现的视图控制器有关。虽然,我宁愿把它丢弃为“返回无效界面方向的随机行为”。