横向模式下的iPhone应用程序,2008系统

时间:2020-03-05 18:37:21  来源:igfitidea点击:

注意:此问题来自2008年,现在仅具有历史意义。

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

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

解决方案:

从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

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

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

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

还是这个:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

还是这个:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

我们可能还必须先调用" window makeKeyAndVisible;"。

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

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

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

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

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

首先我在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中处理视图。

仅历史性答案。明显过时:

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

这篇文章只是出于历史的好奇心。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

试试这个食谱:

在窗口的Info.plist文件中将方向设置为UISupportedInterfaceOrientations,以定义480x320"基本视图控制器"。其他所有视图将作为子视图添加到其视图。在所有视图控制器中,设置" shouldAutorotateToInterfaceOrientation:"方法(当然,要返回我们在plist中定义的相同值)接口构建器景观设计接口构建器景观设计-1

在所有视图控制器中,使用

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

viewDidLoad方法中。

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

参考:

{分块}

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

在我所有的测试中,当关闭模态视图控制器时,即使在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;
 }
...
}