iOS 8.3键盘方向错误

时间:2015-04-24 12:44:42

标签: ios keyboard orientation

我正面临一个奇怪的iOS 8.3问题,它显示键盘的方向错误(视图控制器处于横向模式,但键盘显示在纵向模式下):

the view controller is in Landscape mode, but the keyboard show up in Portrait mode

我可以按照以下步骤触发此问题:

  1. 创建2个UIViewController子类:ViewControllerAViewControllerB

  2. ViewControllerA实施supportedInterfaceOrientations并返回UIInterfaceOrientationMaskPortrait

  3. ViewControllerB实施supportedInterfaceOrientations并返回UIInterfaceOrientationMaskLandscape

  4. 创建一个名为UINavigationController的{​​{1}}子类,实现NavigationController并返回supportedInterfaceOrientations(我这样做是因为我想保留NavigationController并且它是rootVC来自旋转)

  5. 使用[self.topViewController supportedInterfaceOrientations]作为应用的初始视图控制器,将NavigationController设置为ViewControllerA NavigationController

  6. 启动应用,rootViewContrller将显示在肖像中。在ViewControllerA上显示一个按钮,使用ViewControllerA

  7. 按下按钮将显示ViewControllerB
  8. presentViewController:animated:completion将出现在Landscape中;在ViewControllerB上显示文本字段,点击文本字段将触发键盘,但键盘处于纵向模式,就像上图一样。

  9. PS。您可以下载并运行Xcode项目on github

    此问题似乎只出现在iOS 8.3上。难道我做错了什么 ?或许这只是iOS的另一个错误?

    顺便说一句,如果您只是在没有ViewControllerB的情况下直接显示ViewControllerA,则不会发生此问题。因此,如果这是iOS的错误,我怎样才能避免继承ViewController,但仍然保留UINavigationController ViewControllerA的{​​{1}}旋转。

    更新:此错误仍然出现在iOS 8.4上,我在2015年6月17日发布了一个错误报告,并得到了苹果的回复,他们表示已经在最新的iOS 9测试版中解决了这个问题。

2 个答案:

答案 0 :(得分:2)

我们通过欺骗设备认为它被旋转到不同的方向然后进入预期的方向来解决这个问题。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.segmentedControl.selectedSegmentIndex = 0;
    if(!self.rotatingForDismissal)
    {
        [self.tableNumberTextField becomeFirstResponder];
    }


    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.3"))
    {
        [[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeLeft) forKey:@"orientation"];
        [[UIDevice currentDevice] setValue:@(self.interfaceOrientation) forKey:@"orientation"];
    }

}

答案 1 :(得分:0)

我能够使用以下内容正确显示键盘。

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];

  if (SYSTEM_VERSION_GREATER_THAN(@"7.1") && SYSTEM_VERSION_LESS_THAN(@"9.0"))
  {
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] setValue:@(UIDeviceOrientationUnknown) forKey:@"orientation"];
    [[UIDevice currentDevice] setValue:@(orientation) forKey:@"orientation"];
  }
}

请注意,使用UIDeviceOrientationUnknown不会导致副作用,例如视图自动轮换不当。