如何在iOS中处理不同的方向

Sta*_*tas 19 iphone objective-c rotation ios

增加:您可以在github ios6rotations上访问此项目


很抱歉在iOS 6中询问有关屏幕旋转的问题,但这确实是一个痛苦的问题.我仍然无法完全理解它 - 由于某种原因,它在某些情况下表现不同.

我的测试应用程序中有以下简单的视图层次结构:

我想要实现的是 - 将蓝色控制器仅保留在风景中,红色控制器仅保留在纵向中.

我有一个UINavigationController的子类,里面有这样的代码:

@implementation CustomNavController

- (BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return  [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end
Run Code Online (Sandbox Code Playgroud)

在我的蓝色控制器中我实现了这个:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}
Run Code Online (Sandbox Code Playgroud)

而在红色控制器这:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下行为:

  1. 应用程序从横向开始(OK)
  2. 当我按下按钮时,我的红色控制器也在景观中推入(这不好,因为它必须以肖像显示)
  3. 它成功旋转到纵向但不向后旋转到横向
  4. 如果我将红色控制器置于纵向模式,我的蓝色控制器(仅限于横向)将以纵向模式显示.

PS所有我的旋转方法(上面发布的)都被正常调用.(顺便说一下为什么这些方法每次屏幕转换被调用这么多次 - 5-6次)

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 没有被推动调用

所有(portraitUpsideDown除外)方向都包含在plist中.

问题是 - 如何在每个控制器中强制旋转到支持的方向?

我建议你在这里(作为答案)发布任何100%工作代码来处理ios6中的旋转(例如,如果你有一些用于带有SplitController的iPad) - 我会将这个问题留在收藏中,以便在我需要时将所有内容放在一个地方处理某些特定情况.干杯!

补充:请不要将此作为回答从横向发布到肖像我希望有更优雅的方式来做到这一点.

Leo*_*ica 27

使用-[UIDevice setOrientation:]是一个私有API,将拒绝您的应用程序.看到这个问题.

你问的是使用公共API是不可能的,也不建议从HIG的角度来看.支持并且您应该实现的是具有不同支持的接口方向的不同视图控制器的模态表示.这就是为什么默认的实现UINavigationController是始终旋转; 它假设所有视图控制器都具有相同的支持接口方向.

以iPhone上的视频播放为例.打开视频应用程序(iOS附带).根视图控制器仅支持纵向方向.但是,启动视频,弹出一个仅支持横向界面方向的模态视图控制器.这似乎是您希望实现的行为.

这就是preferredInterfaceOrientationForPresentation没有被召唤的原因.preferredInterfaceOrientationForPresentation只在使用时被调用presentViewController:animated:.

小疑难杂症,如果您需要在场景中的每一个阶段一个导航栏,你需要将每个模式视图控制器导航控制器封装.然后,可以通过所要求的数据在prepareForSegue:通过访问topViewController在SEGUE导航控制器的对象.


这里是一个正确的行为根据您的要求(或者至少会给你的想法如何实现)的例子项目:

http://www.mediafire.com/?zw3qesn8w4v66hy


dkl*_*klt 6

我的两分钱值得.

你可以快速呈现一个空的透明模态视图,然后将其关闭,可能在ViewDidLoad:或viewWillAppear:作为快速解决方法在ViewController和ViewControllerSecond类上.

此外,在storyboard中,您可以将ViewController类方向设置为可视化的横向.

  • 哇,除此之外无法让它工作,谢谢! (2认同)