-1

我有一些 UITabBarController。在横向中,我隐藏 tabBar 并展开内容视图。代码如下所示:

-(void)viewWillLayoutSubviews {
  [super viewWillLayoutSubviews];

  UIView *transView = [self.view.subviews objectAtIndex:0];
  if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
      transView.frame = self.view.bounds;
      self.tabBar.hidden = YES;
    } else {
      self.tabBar.hidden = NO;
      CGRect frame = self.view.bounds;
      frame.size.height = self.tabBar.frame.origin.y;
      transView.frame = frame;
    }
}

这可以毫无问题地处理方向更改。

当我添加了UIImagePicker. UIImagePicker显示时强制纵向(Apple 打破了自己的 UI 规则:不强制方向)。
当应用程序处于横向并UIImagePicker显示时viewWillLayoutSubviews,会调用两次并UIInterfaceOrientationIsLandscape(self.interfaceOrientation)返回YES
到目前为止,一切都很好。
现在 whenUIImagePicker关闭(通过选择照片或取消),viewWillLayoutSubviews被调用一次并UIInterfaceOrientationIsLandscape(self.interfaceOrientation)返回YES,所以应该没问题,但结果如下所示: 截屏

可以看到状态栏是横向的(ok),UI是纵向的(失败):ui是纵向显示的,也UIController给状态栏留了一个空间(左边的黑色条纹),UI也被状态裁剪在顶部酒吧。

现在这看起来像一个 iOS 错误,因为UIInterfaceOrientationIsLandscape(self.interfaceOrientation)返回YES但 UI 仍然是纵向的。

环境:iOS 6.1.3 iPod Touch 5g。

有没有办法解决它:使状态栏保持在左侧 x 或强制 UI 横向?


更新:经过进一步调查,我注意到了这一点,willRotateToInterfaceOrientation并且didRotateFromInterfaceOrientation在这种情况下从未被调用过。我什至在不同的地方添加了这个日志,它总是打印“3 3 3 3”(UIInterfaceOrientationLandscapeLeft):

NSLog(@"%d %d %d %d",
      self.navigationController.interfaceOrientation, 
      self.interfaceOrientation, 
      self.selectedViewController.interfaceOrientation, 
      [UIDevice currentDevice].orientation);

所以状态信息说UIInterfaceOrientationLandscapeLeft,但我看到纵向 UI 和横向状态栏。


我添加了这种日志来查看何时执行轮换:

  UIView *view = self.view;
  int i=0;
  while(view) {
    CGAffineTransform trans = view.transform;
    NSLog(@"Transform: %d %@", i, NSStringFromCGAffineTransform(trans));
    ++i;
    view = view.superview;
  }

在正常旋转(从纵向到横向)的情况下,日志如下所示:

Transform: 0 [1, 0, 0, 1, 0, 0]
Transform: 1 [1, 0, 0, 1, 0, 0]
Transform: 2 [1, 0, 0, 1, 0, 0]
Transform: 3 [0, 1, -1, 0, 0, 0]
Transform: 4 [1, 0, 0, 1, 0, 0]

在有问题的情况下:横向设备,关闭UIImagePicker

Transform: 0 [1, 0, 0, 1, 0, 0]
Transform: 1 [1, 0, 0, 1, 0, 0]
Transform: 2 [1, 0, 0, 1, 0, 0]
Transform: 3 [1, 0, -0, 1, 0, 0]
Transform: 4 [1, 0, 0, 1, 0, 0]
Transform: 5 [1, 0, 0, 1, 0, 0]

奇怪的是视图堆栈发生了变化(增加了 1)。也可以看出,带索引的视图3是有问题的。

4

1 回答 1

0

我在这个神秘的问题上找到了 EVIL HACK:

- (void)doAWorkaroudnOnUnwantedRotation {
  // check if is workaround nesesery:
  if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
    double delayInSeconds = 0.5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      UIViewController *fake = [[[UIViewController alloc] init] autorelease];
      UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
      [rootController presentModalViewController: fake animated: NO];
      [fake dismissModalViewControllerAnimated: NO];
    });
  }
}

UIImagePicker我在被解雇时调用此方法。由于选取器是动画的,并且在动画完成之前没有dispatch_after任何反应,因此这种解决方法将不起作用。

于 2013-09-18T10:42:50.647 回答