iPhone风景常见问题和解答

这里有很多的困惑和一系列相应的问题,所以iPhone应用程序如何正确处理横向/纵向模式自动旋转。 当需要以横向模式启动时,实现这样的应用特别困难。 观察到的最常见的效果是混乱的布局和不再识别触摸的屏幕区域。

一个简单的search标签iphonelandscape问题揭示了这些问题,这些问题发生在某些情况下:

  • 横向只有iPhone应用程序与多个笔尖 :应用程序在横向模式下启动,从第一个笔尖视图呈现良好,从不同的笔尖加载的所有视图无法正确显示。

  • 在加载新控制器时,Iphone Landscape模式切换到Portraite模式:自我解释

  • iPhone:在横向,只有在第一个addSubview之后,UITableViewController不能正确旋转 :与上面相同的问题。

  • iPhone横向专用实用程序 – 模板应用程序 :布局错误,控制器似乎无法识别应该旋转的视图,但在横向模式下显示剪辑的纵向视图,导致屏幕的一半保持空白。

  • presentModalViewController在纵向后的纵向viewController :模态视图不正确呈现。

已经提出了一套不同的解决scheme,其中一些解决scheme包括通过CoreGraphics完全定制的animation,而另一些解决schemebuild立在从主笔尖加载的第一个视图控制器始终显示正确的观察上。

我花了大量的时间调查这个问题,最终find了一个解决scheme,不仅是一个部分的解决scheme,而且应该在所有这些情况下工作。 这是我打算与这个CW职位提供一些常见问题解答在UIViewControllers景观模式的问题。

请提供反馈,并通过纳入任何相关意见来帮助提高本文的质量。 如果你知道的话,随时编辑和发布其他/更好的答案。

文档中有什么:

在您的视图控制器中,重写shouldAutorotateToInterfaceOrientation:声明您支持的接口方向。 每当设备方向改变时,该属性将/应该由控制器基础结构检查。

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation { return (orientation == UIInterfaceOrientationLandscapeRight); } 

这是您的视图控制器需要做的绝对最小值。 如果要以横向模式启动应用程序,则需要将以下项添加到.plist文件中:

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

Applebuild议在Landscape Right模式下启动仅横向应用程序(请参阅用户体验指南中的HIG >立即启动)。

什么不在文档中:

一点背景:

每次尝试加载不同于主笔尖加载的视图控制器时,您的视图控制器既不会被询问其支持的接口方向,也不会被正确设置。 只有绑定到窗口的第一个视图控制器才能正确放置。

其他人build议使用连接到主窗口的“MasterViewController”,其他控制器将其视图添加为子视图,而不是直接挂接到窗口。 虽然我发现这个解决scheme是一个可行的select,但在模态视图控制器添加到这些子视图的情况下,它不能正常工作。 如果你有一些应该能够自动控制的子视图(主控制器可以防止什么),也有一个问题。

使用未logging的API强制某个界面方向也不是一个选项。

解决scheme:

目前为止,我find的最佳解决scheme是修改了“MasterViewController”解决方法。 不使用自定义的“MasterViewController”,而是使用具有隐藏导航栏和隐藏选项卡栏的UINavigationController 。 如果所有其他视图都从此控制器的导航堆栈中popup/popup,那么该堆栈上的控制器的自动旋转将被正确pipe理。

通过presentModalViewController:animated:呈现的模态控制器presentModalViewController:animated:UINavigationController的导航堆栈上的任何视图控制器将被旋转和呈现正确的布局。 如果希望模态视图控制器可以旋转到与父视图控制器不同的方向,则需要在呈现模态视图时从控制器的shouldAutorotateToInterfaceOrientation方法返回所需的方向。 为了正确地恢复模式控制器closures时的界面方向,在调用dismissModalViewController:animated:之前,需要确保shouldAutorotateToInterfaceOrientation返回父控制器所需的方向dismissModalViewController:animated: 你可以在你的视图控制器上使用一个私有BOOL来pipe理它(例如BOOL isModalMailControllerActive_ )。

我会尽快添加一段示例代码,现在才迟到。 请让我知道如果有任何未解决的问题仍然存在,或者有关这个职位的任何不清楚。 随意编辑和改进。

我对ios应用程序有一个有趣的要求:

主视图控制器应该只有风景,但所有其他(可以从主要推动)可以是风景和肖像。

问题occours – 当我推到一个新的viewController,然后被旋转portraited – 和回弹 – 主视图不再风景。 另外 – 开放的应用程序,它不是在风景。

为了保持主视图控制器的景观,不pipe从哪个方向popup/推动,我做了以下事情:(在viewWillAppear 🙂

 //set statusbar to the desired rotation position [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; //present/dismiss viewcontroller in order to activate rotating. UIViewController *mVC = [[[UIViewController alloc] init] autorelease]; [self presentModalViewController:mVC animated:NO]; [self dismissModalViewControllerAnimated:NO]; 

希望它会帮助别人!

在sdk 3.2.5 ios 5.0.1上进行了PST

PS感谢这个FAQ的所有信息!

对于第二个项目符号来说,如果你想使用pushViewController从Portrait-only到Landscape-only视图,我发现的一个简单的黑客就是把下面的代码放到你的推送控制器的viewDidLoad中:

 UIViewController *viewController = [[UIViewController alloc] init]; [self presentModalViewController:viewController animated:NO]; [self dismissModalViewControllerAnimated:NO]; [viewController release]; 

我想添加到Johannes的答案(使用UINavigationController作为MasterViewController)。

我发现的缺点是新推到主VC导航堆栈的ViewController不适应任何以前的方向更改。 简而言之,已经在堆栈中的VC被旋转,由它们呈现的模式视图控制器也被旋转,但是新添加的VC 不被旋转。

我已经尝试了很多技巧来解决这个问题之前find一个工程。 大多数只适用于pushViewController:animation设置为YES。

要完全解决这个问题,我已经分类UINagivationController并重写pushViewController:animated:如下所示:

 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { // Correctly autoOrient the given view controller [self presentModalViewController:viewController animated:NO]; [self dismissModalViewControllerAnimated:NO]; // Push it as normal (now in its correct orientation) [super pushViewController:viewController animated:animated]; } 

临时(并且相当不可见)呈现视图控制器允许其接收其方向更新。 然后可以将其按正确的方向推入导航堆栈。

请让我知道这是否适合你。 所有的更新和改进都非常欢迎!

最后,我强烈build议Johannes的轮换pipe理方法。

编辑:更新从堆栈popup视图控制器

看起来,所有与popViewController相关的select器在执行animation:YES时都会变得疯狂。 具体来说,视图控制器是在错误的方向上animation的。 您可以使用animation:NO,并将这些animation的使用限制在层次结构中较深的其他UINavigationController(即,您推送到根控制器的堆栈中)。

任何input,不胜感激。

我正在开发一个iPad应用程序,该应用程序在启动时显示一系列项目的垂直滚animation廊视图。 在横向模式下有4个项目。 在肖像里有三个。 当转向iPad的方向时,应该刷新画廊,使项目整齐地跨屏幕。 然后我双击一个项目以深入到该项目的模态视图。 然后我做这个东西的东西。 最后,我驳斥了模态的观点。

在刷新或方向更改期间,图库视图根据屏幕宽度(或高度)和UIViewController.interfaceOrientation中的当前方向计算要显示的项目数。

我有一个问题得到这个正常工作。 有时在我解散modal dialog后,它只会显示横向的两个项目。

起初,我正在使用UIViewController.view.frame.size值来计算图库项目的数量。 当模态视图被解散时,该框架尺寸不正确,例如,即使在显示modal dialog时方向没有改变,宽度和高度也被反转。

我切换到使用应用程序委托([[UIApplication sharedApplication]委托]]并采取window.frame.size来计算画廊项目的数量显示。window.frame.size保持正确的方向变化和modal dialog下。图库项目现在正确显示。

这将工作…

 UIWindow *window = [[UIApplication sharedApplication] keyWindow]; UIView *view = [window.subviews objectAtIndex:0]; [view removeFromSuperview]; [window addSubview:view];