我有一些 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
是有问题的。