【问题标题】:iPad Initial OrientationiPad 初始方向
【发布时间】:2011-05-05 20:25:24
【问题描述】:

我很难让我的应用正确支持所有方向。 问题在于启动。我已经完成了以下步骤:

  1. 添加:

    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
        <string>UIInterfaceOrientationPortrait</string>
    </array>
    
  2. 确保我的所有视图控制器在 shouldAutorotateToInterfaceOrientation 中始终返回 YES
  3. 添加了所有默认*图像

当处于横向时 - 应用程序开始显示正确的默认图像,但实际应用程序以纵向方式启动。不会调用 willRotate... 和 shouldAutorotate.. 方法。

我什至尝试过 swizzling 方法(来自 Wordpress):

+ (void)youWillAutorotateOrYouWillDieMrBond {
    NSLog(@"youWillAutorotateOrYouWillDieMrBond");
    Swizzle([NSClassFromString(@"UISplitViewController") class], @selector(shouldAutorotateToInterfaceOrientation:), @selector(MyShouldAutorotateToInterfaceOrientation:), NULL);
    Swizzle([NSClassFromString(@"UIViewController") class], @selector(shouldAutorotateToInterfaceOrientation:), @selector(MyShouldAutorotateToInterfaceOrientation:), NULL);
}

- (BOOL)MyShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    NSLog(@"MyShouldAutorotateToInterfaceOrientation (%@)", self);
    return(YES);
}

也没有运气。无论我做什么 - 如果设备是横向的,应用程序就会以纵向启动。

我已阅读相应的 Apple 文档 - 他们声明应用程序始终以纵向启动,但如果 VC 支持方向,则它们会自行旋转。所以看来我正在做我应该做的一切......

这里真的没有想法,如果有任何见解,将不胜感激。

【问题讨论】:

  • 它应该可以工作(并且在我的项目中对我有用)。您在启动时的视图层次结构究竟是什么样的?
  • 这是一个从 iPad 模板构建的标准应用程序,我有一个拆分视图控制器,所以在启动时,会显示详细 vc,并且工具栏上有一个用于打开主 vc 的按钮。

标签: ipad uiviewcontroller orientation uisplitviewcontroller landscape


【解决方案1】:

好的,感谢所有提供帮助的人,但这不是建议的解决方案之一: 似乎我偶然发现了一些 iPAD 错误。

解决方法很简单:

主视图由于某种原因没有收到任何事件,这就是问题所在。我所做的是将 UIViewController 包装在 UINavigationController 中并将其设置为 Master。然后导航控制器 DID 接收事件并传递它们。问题解决了!

【讨论】:

  • 仍然有这个问题,只有这个答案解决了它。这是一个愚蠢的问题!
【解决方案2】:

这可能是您的笔尖设置错误的问题。您可以将笔尖的起始位置更改为横向或纵向。我发现这比使用视图控制器更容易。

为此,请转到界面生成器,选择视图。在“查看属性”窗口中选择最左侧的选项卡并将方向更改为横向。

【讨论】:

  • NIB 中的方向(据我所知)仅用于设计目的。无论如何 - 设置它没有帮助,而且,我也想继续支持肖像。这对我来说不是一个正确的解决方案..
【解决方案3】:

首先,检查您的 info.plist 中是否包含所有四个 UISupportedInterfaceOrientations

接下来,检查您是否将拆分视图添加到应用程序委托的 applicationDidFinishLaunchingWithOptions 中的应用程序窗口(例如[self.window addSubview:splitViewController.view];),而不是稍后,这可能会导致此问题。

另外,UIWindow 仅可靠地将旋转传递给添加到窗口的第一个视图的视图控制器。根据您如何处理拆分视图控制器,这可能是问题所在。确保您需要正确旋转的任何视图都位于添加到窗口的第一个视图的子视图层次结构中,以便它的视图控制器可以正确地向下传递旋转事件。

希望有帮助!

【讨论】:

  • 如问题所述 - plist 文件中提供了所有方向。关于添加拆分视图 - 它是从 MainWindow.xib 启动的,所以它是在 DidFinish 之前启动的。
【解决方案4】:

如果您无法解决问题,请尝试将其添加到您的 Info.plist 文件中。它适用于我的通用应用程序:

<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

这里的区别在于您通过~ipad sn-p 强制这些属性是 iPad 特定的。

如果您想在应用启动时强制定向,您应该尝试更新 applicationDidFinishLaunching: 方法添加这个,以强制通知更改方向:

UIDevice *device = [UIDevice currentDevice];
[device beginGeneratingDeviceOrientationNotifications];

希望这会有所帮助。

如果这不起作用,则可能是与您的应用程序的初始化有关的问题,即您创建 UISplitViewController 并向其添加侧面和细节控制器的方式。在这种情况下,请跳过那段代码。

【讨论】:

  • 感谢您的建议,我尝试了 ~ipad 版本,不幸的是 - 没有骰子,没有帮助。另外,我的应用程序是从 MainWindow.xib 构造的,因此拆分视图不是从代码初始化的
  • 如果您将设备置于横向,它将以纵向启动并且永远不会旋转?
  • 它以纵向开始,但如果我移动设备会旋转。主要问题是应用程序启动时未调用 showAutoRotate(我认为应该如此),它仅在我物理移动设备时调用
  • 我更新了答案,希望强制应用生成方向变化通知对你有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多