如何将自动旋转约束到某些视图的单一方向,同时允许其他方向的所有方向?

epo*_*gee 30 cocoa-touch objective-c uiviewcontroller uinavigationcontroller device-orientation

这个问题是关于UINavigationController中的iOS设备旋转和多个受控视图.有些观点应该限制为纵向,有些观点应该自由旋转.如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常令人讨厌的怪癖.然而,这个场景非常简单,所以我想我要么没有正确地进行自动旋转实施,要么就是忘了什么.

我有一个非常基本的演示应用程序,显示了怪异,我制作了一个视频显示它在行动.

设置非常基本:调用三个视图控制器FirstViewController,SecondViewController并且ThirdViewController所有扩展AbstractViewController显示带有类名称的标签,并且shouldAutorotateToInterfaceOrientation:当设备处于纵向时返回YES .SecondViewController重写此方法以允许所有旋转.所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/关闭来在视图之间导航UINavigationController.到目前为止,我想说的是一个非常简单的场景.

如果您以纵向或横向方向握住设备,这是我不仅希望实现的结果,而且还期望.在第一张图片中,您会看到所有视图都是"直立",而在第二张图片中,您会看到只有第二个视图控制器反转设备的方向.要清楚,应该可以从横向模式的第二个视图导航到第三个视图,但因为第三个视图仅支持纵向方向,所以它应该只能以纵向显示.查看结果是否正常的最简单方法是查看载体条的位置.

纵向模式下设备的预期视图方向 横向模式下设备的预期视图方向

但这个问题在这里是因为实际结果完全不同.根据您在旋转设备时所处的视图,并根据您导航到下一个视图,视图将不会旋转(具体而言,didOrientFromInterfaceOrientation:永远不会调用该方法).如果你在第二个横向并且导航到第三个,它将具有与第二个相同的方向(=坏).但是,如果您从第二个导航回到第一个,则屏幕将旋转为"强制"纵向模式,并且载波条将位于设备的物理顶部,无论您如何握住它.视频更详细地显示了这一点.

横向模式下设备的实际视图方向

我的问题是双重的:

  1. 为什么第一个视图控制器会向后旋转,而不是第三个?
  2. 当您只希望某些视图自动旋转而不是其他视图时,需要采取哪些措施才能从您的视图中获取正确的行为?

干杯,EP.

编辑:作为奖励之前的最后一招,我完全重写了这个问题,使其更短,更清晰,并希望更有吸引力给出答案.

A. *_*nce 8

简短的回答是你正在使用UINavigationController,这不会像你想要的那样工作.来自Apple的文档:

为什么我的UIViewController不会随设备一起旋转?

UITabBarController或UINavigationController中的所有子视图控制器都不同意公共方向集.

要确保所有子视图控制器正确旋转,必须为表示每个选项卡或导航级别的每个视图控制器实现shouldAutorotateToInterfaceOrientation.每个人必须就旋转发生的方向达成一致.也就是说,对于相同的方向位置,它们都应该返回YES.

您可以在此处详细了解视图旋转问题.

您必须根据自己的意愿推出自己的视图/控制器堆栈管理.


Abo*_*tef 5

在App委托中制作一个bolean来控制你想要的方向,例如make bool来启用Portrait,并在你想要的视图控制器中允许Portrait通过共享应用程序启用它

在视图控制器中,您要在其中启用或禁用所需的方向.

((APPNAMEAppDelegate *)[[UIApplication sharedApplication] delegate]).enablePortrait= NO;
Run Code Online (Sandbox Code Playgroud)

在App Delegate中.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSLog(@"Interface orientations");
    if(!enablePortrait)
        return UIInterfaceOrientationMaskLandscape;
    return UIInterfaceOrientationMaskLandscape|UIInterfaceOrientationMaskPortrait;
}
Run Code Online (Sandbox Code Playgroud)

每次旋转设备时都会触发这些方法,基于这些BOOL启用所需的方向.