Answers:
请注意,这个答案现在已经过时/
这个答案只是出于历史的好奇心。
令人兴奋的消息!如以下Andrew所发现,此问题已由Apple在4.0+中修复。
似乎不再需要在每个视图上强加视图的大小,并且解决了“仅在第一次使用”时出现的严重景观问题。
截至2011年4月,不可能测试甚至构建低于4.0的东西,因此这个问题纯粹是历史性的好奇。令人难以置信的是,这么长时间给开发人员造成了多少麻烦!
这是原始的讨论和解决方案。现在,这完全不相关,因为这些系统甚至无法运行。
完全无法完成这项工作非常困难-至少存在三个问题/错误。
试试这个.. 界面生成器的景观设计
特别要注意的是,它说“并且您需要在任何地方正确使用shouldAutorotateToInterfaceOrientation”时,它表示所有地方的所有全屏视图。
希望它能在这场噩梦中有所帮助!
重要的提醒是这里出现了另一个众所周知的问题:如果您试图在一个以上的视图(所有视图)之间进行切换,那么它简直是行不通的。记住这一点很重要,否则您将在问题上浪费很多时间。从字面上看这是不可能的。这是iOS平台上最大的已知漏洞。实际上,没有办法使硬件使您加载的第二个视图成为风景。烦人但简单的解决方法以及您必须执行的操作是,拥有一个琐碎的主UIViewController,除了坐在那里并让您在视图之间交换之外,什么也不做。
换句话说,在iOS中由于一个主要的已知错误:
[window addSubview:happyThing.view];
[window makeKeyAndVisible];
您只能这样做一次。以后,如果您尝试删除happyThing.view,而是将其放置在newThing.view中,则它不起作用-就是这样。机器永远不会将视图旋转到风景。没有特技修复,即使Apple无法使它正常工作。您必须采用的解决方法是拥有一个整体的UIViewController,该UIViewController只是坐在那里并只保存您的各种视图(happyThing,newThing等)。希望能帮助到你!
从Apple Dev网站:
要以横向模式启动应用程序,以便状态栏立即位于适当的位置,请编辑Info.plist文件以添加具有适当值(UIInterfaceOrientationLandscapeRight或UIInterfaceOrientationLandscapeLeft)的UIInterfaceOrientation键,如清单2所示。
清单2:以横向模式启动应用程序
<key>UIInterfaceOrientation</key> <string>UIInterfaceOrientationLandscapeRight</string>
经过我自己测试之后,所有帖子的摘要和集成;检查以下4.x,5.x的更新。
从3.2版本开始,您无法通过代码更改正在运行的应用程序的方向。
但是您可以以固定的方向启动应用程序,尽管这样做并非易事。
试试这个食谱:
UISupportedInterfaceOrientations
为Info.plist
文件中的shouldAutorotateToInterfaceOrientation:
方法(当然,要返回您在plist中定义的相同值)在所有视图控制器中,使用
self.view.frame = CGRectMake(0, 0, 480, 320)
在viewDidLoad
方法中。
更新(iOS 4.x,5.x):《 Apple iOS应用程序编程指南》的“高级应用程序技巧”一章中有“以横向模式启动”段落。
参考文献:
首先我在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中处理视图。
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和Stack Overflow。
我很惊讶还没有人提出这个答案:
在我所有的测试中,当解散模态视图控制器shouldAutorotateToInterfaceOrientation
时,即使在UINavigationController的一部分中,也要遵守父视图控制器的首选方向设置。因此,解决方案很简单:
创建一个带有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;
}
...
}
最新的《 iPhone OS编程指南》对此进行了完整介绍,并提供了示例代码。我确定这是最近添加的,所以也许您错过了它。它说明了您必须遵守的所有条件;基本上...
在第102页上查找“在横向模式下启动”。
查看此答案:仅适用于iPhone或iPad的横向模式
尽管如果您使用混合模式,则可能会更好
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];