我知道这个问题(或它的变体)已经被问过很多次了,但是它仍然是如何最好地解决这个问题而不深入研究笨拙的黑客。
我有一个具有以下布局的应用程序:
UITabBarController
↳ UINavigationController
↳ PortraitViewController
↳ LandscapeViewController
第一个
PortraitViewController
将其 rightBarButtonItem
设置为 UIBarButtonItem
,它调用 landscapeButtonPressed:
。该方法将 LandscapeViewController
推送到 View Controller 堆栈上。在
LandscapeViewController
中,我在初始化期间将 hidesBottomBarWhenPushed
设置为 YES
,因为我只希望导航栏可见。我还在
setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
和 [UIApplication sharedApplication]
中对 loadView
调用 viewWillAppear:
,然后将其重新设置为 UIInterfaceOrientationPortrait
中的 viewWillDisappear:
。在我的
shouldAutorotateToInterfaceOrientation:
实现中,我只为 UIInterfaceOrientationLandscapeRight
返回 YES 。PortraitViewController
如下所示:Portrait View http://img.skitch.com/20091007-18ur7p3iubkrb1if5cak8wdxkb.png
LandscapeViewController
如下所示:Broken Landscape View http://img.skitch.com/20091007-f3ki1ga5m4ytkyg3wgwektp86e.png
如您所见, View 没有正确旋转。如果我在调用
-[UIDevice setOrientation:]
之前调用私有(private) -[UIApplication setStatusBarOrientation:]
方法,我可以让导航栏正确旋转,但我宁愿不调用私有(private)方法,而且似乎没有办法获得我的主 View 的边界用于布置 subview 。使用私有(private)方法会导致:Better Landscape View http://img.skitch.com/20091007-8ckbx6gpbiateju9qjgew4x3k2.png
关于如何解决这个问题的任何想法?
我的目标是拥有一个横向 View ,具有有效的横向 CGRect 坐标,我可以将其用作布局 subview 的基础。
最佳答案
弥敦道,
感觉你把PortraitViewController 设置为UINavigationController 的rootViewController。我还相信您仅在 shouldAutorotateToInterfaceOrientation 方法中将 PortraitViewController 的方向限制为 UIInterfaceOrientationPortrait 。如果是这样,除非您不通过旋转设备来更改设备方向,否则您推送的任何 View Controller 都将具有 rootViewController 本身的方向。
因此,如果您需要在 UIInterfaceOrientationLandscapeRight 方向中使用 LandscapeViewController 那么只需在 shouldAutorotateToInterfaceOrientation: 方法中允许它,并且不要通过显式设置设备方向来搞砸事情。
关于iphone - 在纵向 UITabBarController/UINavigationController 中显示横向 UIViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1530298/