ios - 如何处理 iOS 中的不同方向

标签 ios iphone objective-c rotation

添加: 你可以在 github 上访问这个项目 ios6rotations


很抱歉询问有关 iOS 6 中屏幕旋转的问题,但这真的很让人头疼……而且我仍然不能完全理解它——出于某种原因,它在某些情况下表现不同。

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

我想要实现的是 - 让蓝色 Controller 只在横向上,红色 Controller 只在纵向上

我有一个 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

在我的蓝色 Controller 中我实现了这个:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

在红色 Controller 中:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

现在我有以下行为:

  1. 应用横向启动(OK)
  2. 当我按下按钮时,我的红色 Controller 也被插入横向(这不行,因为它必须以纵向显示)
  3. 它成功旋转到纵向但没有返回到横向
  4. 如果我让红色 Controller 保持纵向模式,我的蓝色 Controller (仅限横向)显示为纵向模式。

附言 我所有的旋转方法(上面发布的)都被正常调用。(顺便说一句,为什么这些方法在每次屏幕转换时被调用这么多次 - 5-6 次)

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 不会通过推送调用

所有(除了 portraitUpsideDown)方向都包含在 plist 中。

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

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

添加: 请不要将此作为答案发布 from landscape to portrait我希望有' 这是更优雅的方式。

最佳答案

使用 -[UIDevice setOrientation:] 是私有(private) API,会导致您的申请被拒绝。参见 this question .

您所要求的使用公共(public) API 是不可能的,从 HIG 的角度来看也不推荐。 受支持并且您应该实现的是具有不同受支持界面方向的不同 View Controller 的模式呈现。这就是为什么 UINavigationController 的默认实现总是旋转;它假定所有 View Controller 都具有相同的受支持界面方向。

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

这就是为什么 preferredInterfaceOrientationForPresentation 没有被调用的原因。 preferredInterfaceOrientationForPresentation 仅在使用 presentViewController:animated: 时被调用。

一个小陷阱,如果您需要在场景的每个阶段都有一个导航栏,您需要将每个模态视图 Controller 包含在一个导航 Controller 中。然后,您可以通过访问 segue 中导航 Controller 对象的 topViewController,在 prepareForSegue: 中传递所需的数据。


这是一个根据您的要求正确运行的示例项目(或者至少会给您一些实现的想法):

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

关于ios - 如何处理 iOS 中的不同方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947349/

相关文章:

iphone - 创建 NSMutableDictionary,它可以在应用程序的任何地方使用

iPhone:如何获取本地货币符号(即 "$"而不是 "AU$")

android - flutter中解析json数据时出现Null Error

ios - WKWebView的标题等于document.title?

ios - 如何在 iOS 中完成循环后停止音频

ios - 更新(继续开发)iOS 应用程序需要什么 "source code files"?

iphone - 检测用户是否仍保持触摸且未松开

iphone - 如何解密加密的 Apple iTunes iPhone 备份?

ios - 从 JSON 响应中解析

objective-c - OS X 计数按下的键没有访问权限