横向模式下的 iPhone 应用程序,2008 系统
-
08-06-2019 - |
题
笔记:这个问题是 2008 年提出的,现在只具有历史意义。
创建从一开始就以横向模式运行(无论设备的位置如何)的 iPhone 应用程序的最佳方法是什么?
既可以通过编程方式也可以使用 Interface Builder。
解决方案
仅历史答案。非常过时:
请注意,这个答案现在已经过时了。
这篇文章是 只是历史的好奇心.
令人兴奋的消息!正如 Andrew 在下面发现的,这个问题已被 Apple 在 4.0+ 中修复。
看来不再需要强制每个视图的视图大小,并且景观“仅在第一次工作”的具体严重问题已经得到解决。
截至 2011 年 4 月,不可能测试甚至构建 4.0 以下的任何版本,因此这个问题纯粹是出于历史好奇。令人难以置信的是,这么长时间以来它给开发者带来了多大的麻烦!
这是最初的讨论和解决方案。现在这完全无关紧要,因为这些系统甚至无法运行。
要使这项工作完全发挥作用是极其困难的——至少存在三个问题/错误。
尝试这个 .. 界面构建器景观设计
特别注意它说的地方 “并且您需要在任何地方正确使用shouldAutorotateToInterfaceOrientation” 这意味着无处不在,所有全屏视图。
希望它对这场噩梦有所帮助!
重要提醒一下这里还有一个众所周知的问题:如果你想在之间交换 超过一个 视图(所有景观), 它根本不起作用. 。记住这一点很重要,否则你会在这个问题上浪费很多时间。这实际上是不可能的。这是 iOS 平台上最大的公开已知错误。实际上没有办法让硬件使您加载的第二个视图成为横向视图。烦人但简单的解决方法,以及你必须做的,是有一个简单的主 UIViewController,它什么也不做,只是坐在那里,让你在视图之间交换。
换句话说,在 iOS 中,由于一个重大的已知错误:
[window addSubview:happyThing.view];
[window makeKeyAndVisible];
您只能这样做一次. 。稍后,如果您尝试删除 happyThing.view,然后放入 newThing.view,则它不起作用 - 就是这样。机器永远不会将视图旋转为横向。没有什么窍门可以解决,即使是苹果公司也无法让它发挥作用。您必须采用的解决方法是拥有一个整体 UIViewController,它只是坐在那里并仅保存您的各种视图(happyThing、newThing 等)。希望能帮助到你!
其他提示
来自苹果开发网站:
要以景观模式启动您的应用程序,以使状态栏立即处于适当的位置,请编辑您的info.plist文件以添加具有适当值的UInterfaceorientation键(uiinterfaceorientationlandlandscaperight或uiinterfaceorientationlandlandscapeleft),如列表2所示。
清单 2:以景观模式开始申请
<key>UIInterfaceOrientation</key> <string>UIInterfaceOrientationLandscapeRight</string>
所有帖子的总结和整合,经过我自己的测试;检查下面的 4.x、5.x 更新。
从 3.2 开始,您无法通过代码更改正在运行的应用程序的方向。
但是您可以以固定方向启动应用程序,尽管这样做并不简单。
尝试用这个食谱:
- 将您的方向设置为
UISupportedInterfaceOrientations
在里面Info.plist
文件 - 在您的窗口中定义一个 480x320“基本视图控制器”。所有其他视图都将作为子视图添加到其视图中。
- 在所有视图控制器中设置
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:如何强制仅横向模式?
@罗伯特:请参阅 iPhone SDK、NDA 和 Stack Overflow.
我很惊讶还没有人提出这个答案:
在我的所有测试中,当关闭模态视图控制器时,父视图控制器的首选方向设置为 shouldAutorotateToInterfaceOrientation
即使是 UINavigationController 的一部分也会受到尊重。所以解决这个问题的方法很简单:
创建一个虚拟 UIViewController,并使用 UIImageView 作为背景。将图像设置为应用程序启动时使用的 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 编程指南对此有完整的部分,并带有示例代码。我确信这是最近添加的,所以也许您错过了。它解释了您必须遵守的所有条件;基本上...
- 设置 Info.plist 属性(这会更改状态栏的位置,但不会更改视图)
- 在 UIViewController viewDidLoad 上手动围绕其中心旋转视图:方法或您的应用程序DidFinishLaunching:方法或实现自动旋转(“自动调整大小行为”,第 124 页)
查找“以横向模式启动”,第 102 页。
看这个答案: 横向模式仅适用于 iPhone 或 iPad
- 将方向添加到 plist
- 所有文件中的 shouldAutorotateToInterfaceOrientation = YES
尽管如果您使用混合模式,您可能会更好
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];