23

补充: 我看到我的问题经常被查看而没有投票,所以我决定你们没有得到你搜索的内容。将您重定向到对如何处理 iOS6 中的方向更改有非常好的答案 的问题

对方向变化的具体要求: 限制旋转

欢迎点赞:)


我从 Master Detail 模板创建了一个新项目,并尝试以横向启动它。如你所知

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

方法已弃用,我们必须使用

- (NSUInteger)supportedInterfaceOrientations

和/或

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

这是我的代码:

- (NSUInteger)supportedInterfaceOrientations {
    NSLog(@"supported called");
    return UIInterfaceOrientationMaskAll;//Which is actually a default value
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    NSLog(@" preferred called");//This method is never called. WHY?
    return UIInterfaceOrientationLandscapeRight;
}

如您所见,我正在尝试以首选方法返回横向,但它从未被调用。ps 文档指出:

讨论 当视图控制器全屏呈现时,系统会调用此方法。当您的视图控制器支持两个或多个方向但内容在其中一个方向中显示最佳时,您可以实现此方法。

如果您的视图控制器实现了此方法,那么当呈现时,它的视图会以首选方向显示(尽管稍后可以将其旋转到另一个受支持的旋转)。如果不实现此方法,系统将使用状态栏的当前方向呈现视图控制器。

所以,问题是:为什么 prefferredOrientation 方法永远不会被调用?以及我们应该如何处理不同控制器中的不同方向?谢谢!PS不要将问题标记为重复。我已经调查了所有类似的问题,但他们没有我的答案。

4

3 回答 3

34

关于 PreferredInterfaceOrientationForPresentation

preferredInterfaceOrientationForPresentation永远不会被调用,因为这不是一个“呈现”的视图控制器。这里不涉及“演示”。

“呈现”和“呈现”并不是一些模糊的术语,意思是“出现”。这些是精确的技术术语,意味着该视图控制器与 call 一起发挥作用presentViewController:animated:completion:。换句话说,这个事件只有在我们过去称之为“模态”视图控制器的情况下才会到达。

好吧,您的视图控制器不是模态视图控制器;它没有发挥作用presentViewController:animated:completion:。所以没有涉及“演示”,因此preferredInterfaceOrientationForPresentation在这里无关紧要。

我对此非常明确,因为我认为很多人会像你一样感到困惑或误导。所以也许这篇笔记会对他们有所帮助。

进入景观

在 iOS 6 中,Info.plist 中的“Supported Interface Orientations”键比以前更受重视。启动所需方向的整体问题的解决方案是:

  1. 确保 Info.plist 中的“支持的界面方向”列出了您的应用程序将允许采用的所有方向。

  2. 确保所需的启动方向首先位于“支持的界面方向”中。

这里的所有都是它的。实际上,您不必将任何代码放入根视图控制器来管理初始方向。

于 2012-10-15T14:06:27.210 回答
8

如果您想在横向模式下启动模态视图,只需将此代码放在呈现的视图控制器中

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(orient)) {
        return orient;
    }

    return UIInterfaceOrientationLandscapeLeft;
}

然后,像往常一样展示这个控制器

UIViewController *vc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self.navigationController presentViewController:vc animated:YES completion:^{}];
于 2013-02-13T13:24:19.690 回答
0

有一个非常简单的答案:您只能更改或修复模态呈现视图控制器的界面方向。如果你这样做,即在界面构建器(或导航控制器方法)中使用 Present Modally segue,你可以定义允许的方向

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}

当您只在导航控制器上按下视图控制器时,此事件不会触发......所以:您没有返回按钮,需要一个

[self dismissViewControllerAnimated:YES completion: ^(void) {

    }];

关闭它。

于 2015-03-24T13:30:17.197 回答