2010-04-29 60 views
6

我最近遇到了一个问题。我的iPad应用程序以某种方式阻止iPad自动旋转。我的应用程序为两个视图控制器加载一个UISplitView,并为shouldAutorotateToInterfaceOrientation返回YES。我已经建立了我的info.plist,以包含所有四个方向的“支持的界面方向”键。但是,当我运行应用程序时,旋转设备不会旋转splitView(即使我正在接收UIDeviceOrientationDidChangeNotification)。另外,当我以不同的方向退出我的应用程序时,它在iPad主屏幕中开始不会自动旋转到正确的视图,直到我再次旋转它而没有运行我的应用程序....任何想法都将不胜感激...UiSplitViewController不自动旋转

回答

8

UISplitViewController是我曾经使用过的最气质的视图控制器子类之一。为了使其“完美”工作,它必须必须作为应用程序窗口中的单个根视图存在。但是,你可以用一些欺骗手段解决这个问题 - 在我的情况下,我需要一个UITabBarController以及至少两个不同的UISplitViewController作为视图控制器 - 但是你必须考虑涉及旋转和UISplitViewControllerDelegate回调没有触发的奇怪情况。

这里的希望,Apple的UISplitViewController在未来其他UIKit组件更兼容...

+1

你可以绕过它欺骗你说...什么欺骗?你逗弄! – radven 2012-07-12 10:11:19

+0

它只是手动转发适当的旋转方法。记录一堆东西,看看有什么方法,我们没有被调用。然后,我只是在我的根视图控制器子类中进行补偿,确保子视图控制器获得了正确的方法,调整了视图的大小等。 – LucasTizma 2012-07-12 14:05:07

+0

我现在有同样的问题,有我的SplitViewController,它们是TabBarController下的选项卡,行为不稳定,所以很高兴知道这不仅仅是我!至少感谢这种安慰! – Gowiem 2013-04-11 22:46:21

0

你说你的第一个问题是,UISplitView阻止你自动旋转。尝试使用Splitview的子类,而不是使用ENVILE自动旋转:

@implementation SplitViewControllerRotating 
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    NSLog(@"SplitViewControllerRotating shouldAutorotate"); 
    return YES; 
} 
@end 

你的第二个问题听起来很奇怪。你说退出你的应用程序后,你必须旋转,以便您的iPad识别面向接口。不能帮助你。

+2

我给它一个镜头......它没有工作......是不是UISplitView自动旋转的目的? – Michael 2010-05-27 18:37:36

+0

有没有人知道iOS 9上的解决方案?以上回答的答案已弃用。 – vaberer 2015-09-15 09:32:06

0

我现在有同样的问题。原因是我不小心将的另一个视图添加到了UISplitViewController视图的窗口中。删除额外的视图使其工作。

1

你的UISplitViewController设置为你的根视图控制器吗?否则,这可能是您的问题的原因。我有一个类似的问题 - 状态栏会旋转,但我的细节和主视图将保持原样。我重新安排了视图,以便UISplitViewController是根,然后我的“主菜单”作为分割视图顶部的模式视图控制器呈现,并且使旋转问题消失。

根据iPad Programming Guide,“分割视图控制器的视图应始终安装为应用程序窗口的根视图。”

希望这会有所帮助。

4

我碰到了同样的问题有两个下属UINavigationControllers。在我的情况下,旋转开始工作,一旦我取代了shouldAutorotateToInterfaceOrientation:在左侧控制器中总是返回'YES'。

+2

masterView和detailView都需要支持YES,无论您想要旋转的方向如何。如果其中一个没有返回YES,它将不会旋转。我错过了这个微妙的细节,我的masterView只支持肖像。希望这可以帮助别人。 – sasquatch 2012-02-09 16:56:05

1

我发现这做工精细 - 提供UISplitViewController的两个孩子实施shouldAutorotateToInterfaceOrientation

I.e如果您有类似:

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil]; 
     UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController]; 

     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil]; 
     UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController]; 

     self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController]; 

     self.window.rootViewController = self.splitViewController; 

来定义你的NSApplicationrootViewController那么两个MasterViewControllerDetailViewController应该实现:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return YES; 
} 

,以确保旋转的作品。