注意:这个问题来自2008年,现在只具有历史意义。
无论设备的位置如何,创建从横向模式运行的iPhone应用程序的最佳方法是什么?
以编程方式和使用Interface Builder。
答案 0 :(得分:46)
请注意,这个答案现在已经过时了。
这篇文章只是历史好奇。
令人兴奋的消息!正如Andrew在下面发现的那样,这个问题已经由Apple在4.0 +中解决了。
似乎不再需要在每个视图上强制视图的大小,并且已经解决了“仅在第一次工作”的景观的特定严重问题。
截至2011年4月,无法测试甚至构建低于4.0的任何内容,因此这个问题纯粹是一种历史性的好奇心。令人难以置信的是它给开发人员带来了多长时间的麻烦!
这是最初的讨论和解决方案。这完全不相关,因为这些系统甚至无法操作。
让这项工作充分发挥是非常困难的 - 至少有三个问题/错误在起作用。
试试这个.. interface builder landscape design
请特别注意,在“的位置,你需要在任何地方正确使用shouldAutorotateToInterfaceOrientation”,这意味着无处不在,所有的全屏视图。
希望在这场噩梦中有所帮助!
此处有一个重要的提醒:此处有一个众所周知的问题:如果您尝试在 多于一个 视图(所有景观)之间切换, IT SIMPLY不工作 。记住这一点至关重要,否则你会在这个问题上浪费时间。这实际上是不可能的。它是iOS平台上最大的已知漏洞。实际上没有办法让硬件使你加载的第二个视图成为风景。令人烦恼但简单的解决方法,以及你必须做的,有一个简单的主UIViewController除了坐在那里让你在你的视图之间交换时什么都不做。
换句话说,在iOS中,因为一个主要的知识错误:
[window addSubview:happyThing.view];
[window makeKeyAndVisible];
您只能执行一次 。稍后,如果您尝试删除happyThing.view,而是将newThing.view放入其中,那么它就不起作用了 - 就是这样。机器永远不会将视图旋转到横向。没有诀窍修复,即使苹果无法使其发挥作用。你必须采用的解决方法是拥有一个整体的UIViewController,它只是坐在那里,只保存你的各种视图(happyThing,newThing等)。希望它有所帮助!
答案 1 :(得分:40)
来自Apple Dev Site:
以横向方式启动应用程序 模式,以便状态栏在 立即适当的位置,编辑 你的Info.plist文件添加 用户的UIInterfaceOrientation键 适当的价值 (UIInterfaceOrientationLandscapeRight 要么 UIInterfaceOrientationLandscapeLeft) 如清单2所示。
清单2:启动您的应用程序 在横向模式
<key>UIInterfaceOrientation</key> <string>UIInterfaceOrientationLandscapeRight</string>
答案 2 :(得分:27)
自己测试后,所有帖子的摘要和集成;检查以下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应用程序编程指南在“高级应用程序技巧”一章中有一个“在横向模式下启动”段落。
参考文献:
答案 3 :(得分:7)
首先我在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中处理视图。
答案 4 :(得分:6)
- (void)applicationDidFinishLaunchingUIApplication *)application {
application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}
或者这个:
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
或者这个:
[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];
您可能还必须先致电window makeKeyAndVisible;
。
一些链接:Developing in landscape mode,iPhone SDK: How to force Landscape mode only?
@Robert:请参阅The iPhone SDK, NDA, and Stack Overflow。
答案 5 :(得分:5)
我很惊讶没人提出这个答案:
在我的所有测试中,当解雇模态视图控制器时,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;
}
...
}
答案 6 :(得分:4)
最新的iPhone OS编程指南有一个完整的部分,带有示例代码。我相信这是最近添加的,所以也许你错过了它。它解释了您必须遵守的所有条件;基本上...
查找“在横向模式下启动”,第102页。
答案 7 :(得分:3)
请参阅此答案:Landscape Mode ONLY for iPhone or iPad
虽然如果您使用的是混合模式,那么
可能会更好[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];