【问题标题】:iPhone app in landscape mode, 2008 systems横向模式下的 iPhone 应用程序,2008 系统
【发布时间】:2010-09-05 06:00:58
【问题描述】:

请注意,这个问题来自 2008 年,现在仅具有历史意义。


创建一个从一开始就以横向模式运行的 iPhone 应用程序的最佳方法是什么?无论设备的位置如何?

以编程方式和使用 Interface Builder。

【问题讨论】:

  • 对于任何未来的读者,请注意,截至 2011 年,这个著名的问题现在由 Apple 解决。请注意下面答案中的测试项目。

标签: ios objective-c landscape


【解决方案1】:

仅限历史答案。非常过时。

请注意,这个答案现在已经过时了/

这个答案只是历史上的好奇


令人振奋的消息!正如下面 Andrew 所发现的,Apple 已在 4.0+ 中修复了此问题。

似乎不再需要在每个视图上强制视图的大小,并且景观“仅在第一次工作”的具体严重问题已经解决。

截至 2011 年 4 月,无法测试甚至构建低于 4.0 的任何东西,所以这个问题纯粹是历史上的好奇。这么长时间给开发者带来了多大的麻烦,真是不可思议!


这是最初的讨论和解决方案。现在这完全无关紧要,因为这些系统甚至无法运行。


要完全完成这项工作是极其困难的——至少存在三个问题/错误。

试试这个 ..interface builder landscape design

特别注意它说“并且你需要在任何地方正确使用 shouldAutorotateToInterfaceOrientation” 它意味着无处不在,你的所有全屏视图。

希望它对这场噩梦有所帮助!

这里要提醒大家注意另外一个众所周知的问题:如果您尝试在 MORE THAN ONE 视图(所有横向)之间切换, 它根本不起作用。记住这一点很重要,否则你会在这个问题上浪费几天的时间。这实际上是不可能的。这是 iOS 平台上最大的已知漏洞。从字面上看,没有办法让硬件使您加载的第二个视图成为风景。烦人但简单的解决方法,以及您必须做的,就是拥有一个微不足道的主 UIViewController,它只会坐在那里让您在视图之间切换。

也就是说,在 iOS 中因为一个重大的已知 bug:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

您只能这样做一次。稍后,如果您尝试删除 happyThing.view,而是将 newThing.view 放在那里,它不起作用 - 就是这样。机器永远不会将视图旋转为横向。没有任何技巧可以修复,即使 Apple 也无法使其正常工作。您必须采用的解决方法是拥有一个整体 UIViewController,它只是坐在那里并只保存您的各种视图(happyThing、newThing 等)。希望对您有所帮助!

【讨论】:

  • 我相信这已在 4.x 中得到修复。我们发布的游戏有很多不同的屏幕,一些横向和一些纵向,但它在 3.x 中无法运行。我们不想进入额外的虚拟视图来处理它,而是需要 4.x - 在提出这个问题一年后,它可能还可以。
  • 我们没有做“总是横向”,而是做各种横向或纵向。每个 VC 都直接添加到窗口中或从窗口中删除。应用程序启动横向,通过几个屏幕转换保持这种方式。我们不使用虚拟视图,但我们会在每个屏幕中覆盖 shouldAutorotate。在 4.x 上没有问题,从触摸板到手机。
【解决方案2】:

sasb 和 michaelpryor 的答案似乎是正确的,但如果它不适合您,请尝试以下替代方法:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

或者这个:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

或者这个:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

您可能还需要先致电window makeKeyAndVisible;

几个链接:Developing in landscape modeiPhone SDK: How to force Landscape mode only?

@Robert:请参考The iPhone SDK, NDA, and Stack Overflow

【讨论】:

    【解决方案3】:

    所有帖子的总结和整合,经过我自己的测试;检查下面 4.x、5.x 的更新。

    从 3.2 开始,您无法通过代码更改正在运行的应用程序的方向。

    但是您可以以固定的方向启动应用程序,尽管这样做并不简单。

    试试这个食谱:

    1. Info.plist 文件中将您的方向设置为UISupportedInterfaceOrientations
    2. 在您的窗口中定义一个 480x320 的“基本视图控制器”。其他所有视图都将作为子视图添加到其视图中。
    3. 在所有视图控制器中设置 shouldAutorotateToInterfaceOrientation: 方法(当然,返回您在 plist 中定义的相同值)
    4. 在所有视图控制器中设置背景视图

      self.view.frame = CGRectMake(0, 0, 480, 320)

      viewDidLoad 方法中。

    更新(iOS 4.x、5.x):Apple iOS 应用程序编程指南在“高级应用程序技巧”一章中有“以横向模式启动”段落。

    参考资料:

    【讨论】:

    • 我可以确认这是唯一真正有效的解决方案(添加了一点点)。我花了几个小时才找到并评估它。所有其他答案只是问题的部分解决方案。
    【解决方案4】:

    看到这个答案:Landscape Mode ONLY for iPhone or iPad

    1. 为 plist 添加方向
    2. shouldAutorotateToInterfaceOrientation = YES 在所有文件中

    虽然如果你使用混合模式,你可能会更好

    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
    

    【讨论】:

      【解决方案5】:

      我很惊讶还没有人提出这个答案:

      在我所有的测试中,当关闭模态视图控制器时,即使是 UINavigationController 的一部分,父视图控制器在 shouldAutorotateToInterfaceOrientation 中设置的首选方向也会得到尊重。所以解决这个问题很简单:

      创建一个带有 UIImageView 的虚拟 UIViewController 作为背景。将图像设置为您的应用在启动时使用的 default.png 图像。

      viewWillAppear 在您的根视图控制器中被调用时,只显示没有动画的虚拟视图控制器。

      viewDidAppear 在您的虚拟视图控制器中被调用时,使用漂亮的交叉溶解动画关闭视图控制器。

      这不仅有效,而且看起来不错!顺便说一句,为了澄清起见,我像这样执行根视图控制器的viewWillAppear

      - (void)viewWillAppear:(BOOL)animated
      {
       if ( dummy != nil ) {
        [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
        [self presentModalViewController:dummy animated:NO];
        [dummy release];
        dummy = nil;
       }
      ...
      }
      

      【讨论】:

        【解决方案6】:

        首先我在 info.plist 中设置

        <key>UIInterfaceOrientation</key>
        <string>UIInterfaceOrientationLandscapeRight</string>
        

        然后我把这段代码放在 applicationDidFinishLaunching 中:

        CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
        [window setTransform:rotate];
        
        CGRect contentRect = CGRectMake(0, 0, 480, 320); 
        window.bounds = contentRect; 
        [window setCenter:CGPointMake(160.0f, 240.0f)]; 
        

        这样我可以在 Interface Builder 中以横向模式处理视图。

        【讨论】:

          【解决方案7】:

          最新的 iPhone OS 编程指南对此有完整的部分,并附有示例代码。我相信这是最近添加的,所以也许你错过了。它解释了您必须遵守的所有条件;基本上……

          • 设置 Info.plist 属性(这会更改状态栏的位置,但不会更改视图)
          • 在 UIViewController viewDidLoad: 方法或 applicationDidFinishLaunching: 方法上手动围绕视图中心旋转视图,或实现自动旋转(“自动调整行为”,第 124 页)

          查找“以横向模式启动”,第 102 页。

          【讨论】:

            【解决方案8】:

            来自 Apple 开发网站:

            在横向启动您的应用程序 模式,使状态栏处于 立即合适的位置,编辑 你的 Info.plist 文件添加 UIInterfaceOrientation 键与 适当的值 (UIInterfaceOrientationLandscapeRight 要么 UIInterfaceOrientationLandscapeLeft), 如清单 2 所示。

            清单 2:启动您的应用程序 横向模式

            <key>UIInterfaceOrientation</key>
            <string>UIInterfaceOrientationLandscapeRight</string>
            

            【讨论】:

            • 这加上你的 shouldAutorotateToInterfaceOrientation 方法返回 (interfaceOrientation != UIInterfaceOrientationPortrait);你就完成了。
            • 问题询问如何以横向模式启动设备。答案提供了这些信息。问题中没有提到之后的处理方向。 +1 迈克尔·普赖尔
            • 有趣的是,“答案”实际上不会以横向模式启动设备 - !!它可能是所有 Apple 环境中最著名的错误/困难。这是非常工作的 iPad 开发人员的基础!
            • @mbehan 还有 UIInterfaceOrientationPortraitUpsideDown,因此不是修复。此外,.plist 中的 UIInterfaceOrientation 仅在 3.2+ 上受支持,在 3.1.3 及更早版本的设备上不支持(请记住 iPhone 2G 卡在该版本上)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-21
            • 1970-01-01
            • 1970-01-01
            • 2010-10-13
            • 2014-03-12
            • 2016-03-23
            • 2010-12-07
            相关资源
            最近更新 更多