iOS 8.3 键盘方向问题漏洞

6
我遇到了一个奇怪的iOS 8.3问题,它显示了一个错误方向的键盘,就像这样(视图控制器处于横向模式,但键盘显示为纵向模式):

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

我可以通过以下步骤触发这个问题:

  1. 创建两个 UIViewController 的子类: ViewControllerAViewControllerB

  2. ViewControllerA 中实现 supportedInterfaceOrientations 方法并返回 UIInterfaceOrientationMaskPortrait

  3. ViewControllerB 中实现 supportedInterfaceOrientations 方法并返回 UIInterfaceOrientationMaskLandscape

  4. 创建一个名为 NavigationControllerUINavigationController 子类,实现 supportedInterfaceOrientations 方法并返回 [self.topViewController supportedInterfaceOrientations] (这样做是因为我想保持导航控制器及其根视图控制器不旋转)

  5. NavigationController 作为应用程序的初始视图控制器,将 ViewControllerA 设置为 NavigationControllerrootViewContrller

  6. 启动应用程序,ViewControllerA 将以纵向模式显示。在 ViewControllerA 上显示一个按钮,按下该按钮将使用 presentViewController:animated:completion 方法呈现 ViewControllerB

  7. ViewControllerB 将以横向模式显示;在 ViewControllerB 上显示一个文本字段,点击文本字段将触发键盘,但是键盘处于纵向模式,就像上面的图片一样。

PS. 您可以下载并运行Xcode项目在Github上

这个问题似乎只出现在iOS 8.3上。我做错了什么吗?还是这只是iOS的另一个bug?

顺便说一下,如果您直接显示ViewControllerA而没有ViewController,则不会出现此问题。因此,如果这是iOS的一个bug,我如何避免从子类化UINavigationController但仍保持ViewControllerA,它是UINavigationController的rootViewController,不旋转。


更新:这个bug仍然在iOS 8.4上出现,我已经提交了一个bug报告,并于2015年6月17日收到了苹果的回复,他们说已经在最新的iOS 9测试版中解决了这个问题。

3个回答

3
我向技术支持咨询了此问题,他们表示:
我们的工程师已经审查了您的请求,并确定最好将其作为错误报告处理。
因此,可以确认这是系统漏洞。
目前的解决方案是在ViewControllerA和ViewControllerB之间添加一个ViewControllerC(支持纵向和横向模式):ViewControllerA应该使用动画呈现ViewControllerC,当ViewControllerC出现后,以无动画方式呈现ViewControllerB。
为了使过渡看起来自然,您可以将ViewControllerC的背景颜色设置为与ViewControllerB相同,或者对ViewControllerB进行屏幕截图并将它添加到ViewControllerC作为背景图像。
这不是一个完美的解决方案,对于用户来说,可能会发现ViewControllerB需要更多时间来加载。

你是否就这个问题提交了 Radar?我在 iOS 8.3 上也遇到了同样的问题。 - user1165756

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"];
    }

}

是的!这比我的解决方案好多了。谢谢! - ultragtx

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不会导致诸如视图不适当自动旋转等副作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接