关于ios:横屏模式下的iPhone应用程序,2008系统

关于ios:横屏模式下的iPhone应用程序,2008系统

iPhone app in landscape mode, 2008 systems

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

从头开始,不管设备处于什么位置,创建以横向模式运行的iPhone应用程序的最佳方法是什么?

既可以通过编程方式也可以使用Interface Builder。


仅历史答案。惊人地过时了。

请注意,此答案现在已经过时/

这个答案只是出于历史的好奇心。

令人兴奋的消息!如以下Andrew所发现,此问题已由Apple在4.0+中修复。

似乎不再需要在每个视图上强制使用该视图的大小,并且解决了"仅在第一次使用时"景观的特定严重问题。

截至2011年4月,不可能测试甚至构建低于4.0的东西,所以这个问题纯粹是历史性的好奇。令人难以置信的是,这么长的时间给开发人员造成了多大的麻烦!

这是原始的讨论和解决方案。现在,这完全不相关,因为这些系统甚至无法运行。

完全无法完成这项工作非常困难-至少存在三个问题/错误。

试试这个..界面生成器的景观设计

特别要注意的是,它说"并且您需要在任何地方正确使用shouldAutorotateToInterfaceOrientation"时,它表示在任何地方,所有全屏视图。

希望它能在这场噩梦中有所帮助!

重要的提醒是这里出现了另一个众所周知的问题:如果您要在一个以上的视图(所有视图)之间切换,则根本不起作用。记住这一点很重要,否则您将在问题上浪费很多时间。从字面上看这是不可能的。这是iOS平台上最大的已知漏洞。实际上,没有办法使硬件使您加载的第二个视图成为风景。烦人但简单的解决方法以及必须要做的就是拥有一个琐碎的主UIViewController,它只坐在那儿什么都不做,让您在视图之间交换。

换句话说,在iOS中由于一个主要的已知错误:

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

您只能这样做一次。以后,如果您尝试删除happyThing.view,而是将其放置在newThing.view中,则它不起作用-就是这样。机器将永远不会将视图旋转到风景。没有技巧修复,甚至Apple也无法使它起作用。您必须采用的解决方法是拥有一个整体UIViewController,该UIViewController只是坐在那里并只保存您的各种视图(happyThing,newThing等)。希望能帮助到你!


从Apple Dev网站:

To start your application in landscape
mode so that the status bar is in the
appropriate position immediately, edit
your Info.plist file to add the
UIInterfaceOrientation key with the
appropriate value
(UIInterfaceOrientationLandscapeRight
or
UIInterfaceOrientationLandscapeLeft),
as shown in Listing 2.

Listing 2: Starting your application
in landscape mode

1
2
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>


经过我自己测试后,所有帖子的摘要和集成;检查以下4.x,5.x的更新。

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

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

试试这个食谱:

  • Info.plist文件中将方向设置为UISupportedInterfaceOrientations
  • 在窗口中定义一个480x320"基本视图控制器"。其他所有视图将作为子视图添加到其视图。
  • 在所有视图控制器中设置shouldAutorotateToInterfaceOrientation:方法(当然,要返回您在plist中定义的相同值)
  • 在所有视图控制器中,使用

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

    viewDidLoad方法中。

  • 更新(iOS 4.x,5.x):《 Apple iOS应用程序编程指南》的"高级应用程序技巧"一章中有"以横向模式启动"段落。

    参考文献:

    • 界面生成器景观设计
    • 界面生成器环境设计-1

    首先我在info.plist中设置

    1
    2
    <key>UIInterfaceOrientation</key>
    <string>UIInterfaceOrientationLandscapeRight</string>

    然后将这段代码放在applicationDidFinishLaunching中:

    1
    2
    3
    4
    5
    6
    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中处理视图。


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

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

    或者这个:

    1
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

    或者这个:

    1
    [application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

    您可能还必须先调用window makeKeyAndVisible;

    一些链接:在横向模式下开发,iPhone SDK:如何仅强制横向模式?

    @Robert:请参阅iPhone SDK,NDA和堆栈溢出。


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

    在我所有的测试中,当解散模态视图控制器时,即使在UINavigationController的一部分中,也要遵守shouldAutorotateToInterfaceOrientation中设置的父视图控制器的首选方向。因此,解决方案很简单:

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

    在根视图控制器中调用viewWillAppear时,只需显示不带动画的虚拟视图控制器即可。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - (void)viewWillAppear:(BOOL)animated
    {
     if ( dummy != nil ) {
      [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
      [self presentModalViewController:dummy animated:NO];
      [dummy release];
      dummy = nil;
     }
    ...
    }


    最新的《 iPhone OS编程指南》对此进行了完整介绍,并提供了示例代码。我确定这是最近添加的,所以也许您错过了它。它说明了您必须遵守的所有条件;基本上...

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

    在第102页上查找"在横向模式下启动"。


    看到这个答案:仅适用于iPhone或iPad的横向模式

  • 向plist添加方向
  • 所有文件中的shouldAutorotateToInterfaceOrientation = YES
  • 虽然如果您使用混合模式,则可能会更好

    1
    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

    推荐阅读