【问题标题】:Why is ViewController's initial orientation is not landscape when it should be?为什么 ViewController 的初始方向应该不是横向的?
【发布时间】:2011-11-20 18:31:43
【问题描述】:

我正在制作一个仅支持 iOS 设备横向模式的应用。所以我将它设置为仅在shouldAutorotateToInterfaceOrientation: 中为UIInterfaceOrientationLandscapeRightUIInterfaceOrientationLandscapeLeft 返回YES,并将Info.plist 中的初始方向设置为UIInterfaceOrientationLandscapeRight。应用显示正常。

问题是在视图加载完成之前坐标系不是横向的(我不确定这里何时正确应用)。我所知道的是,它在启动时调用:shouldAutorotateToInterfaceOrientation 时会更改为正确的坐标空间。问题是当viewDidLoadinitWithCoder: 都被调用时,它位于错误的坐标空间中,在shouldAutorotate... 之前。

我的意思是,如果我使用CGRectMake(0, 0, 480, 320)(而不是使用 self.view.frame 或其他东西)将视图设置为屏幕的整个宽度,那么当坐标空间被旋转“校正”时,它就会被破坏。 viewDidLoad 中创建的视图应用了旋转,因此它们是错误的。这使得在这些方法中设置视图很痛苦,而且非常不合逻辑。我猜这是如何处理方向的问题。为什么它会这样?我已经以各种可能的方式告诉它我只想要横向位置。这可以是界面生成器和属性的东西吗?

这是使用标准的UIViewController。然而,新视图也是从viewDidLoad 中的 .xib 文件加载的。会不会是这个问题?

【问题讨论】:

    标签: ios objective-c cocoa-touch orientation


    【解决方案1】:

    对方向更改的支持是所有 iOS 开发人员有时都在努力解决的问题。这常常令人困惑和沮丧。这是一个经验法则,它可以处理 95% 的方向问题:

    viewWillAppear: 之前不会发生与方向相关的界面更改(例如调整框架大小)。在此之前,您的视图将处于纵向模式即使您的应用仅支持横向或您的应用已经处于横向模式

    由于viewDidLoad: 出现在viewWillAppear: 之前,因此尚未发生方向布局更改。因此,在viewDidLoad 中执行以下任何操作通常会产生不稳定的结果(取决于视图的 autoResize 设置方式):

    • 在视图内插入一个层(例如渐变),其框架等于视图的边界。插入的图层将始终是纵向模式下视图的大小。如果该视图在旋转到横向视图时拉伸,则您的图层将小于视图。
    • 尝试确定表格视图的大小并将该框架用于其他视图
    • 手动添加子视图控制器并使用容器视图的框架来确定子视图控制器的视图框架。

    【讨论】:

    • 谢谢!这很有帮助。很好的经验法则。
    【解决方案2】:

    我今天刚刚阅读了UIViewController 文档,我记得读过这个。

    来自“处理视图旋转”概述部分:

    默认情况下,UIViewController 类仅以纵向模式显示视图。要支持其他方向,您必须重写 shouldAutorotateToInterfaceOrientation: 方法并为您的子类支持的任何方向返回 YES。如果您的视图的自动调整大小属性配置正确,那么您可能只需要这样做。但是,UIViewController 类为您提供了额外的钩子,以便您根据需要实现额外的行为。

    注意:在启动时,应用程序应始终将其界面设置为纵向。在application:didFinishLaunchingWithOptions: 方法返回后,应用程序使用上述视图控制器旋转机制将视图旋转到适当的方向,然后再显示窗口。

    http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW57

    我能想到的可能会给您带来额外麻烦的一件事是,如果您在子视图上设置 autoresizingMask 选项。如果您的所有数字都错误,则可能很难预测视图旋转和调整大小时会发生什么。

    如果您使用自定义 UIVIews,您可能需要覆盖 layoutSubviews: 以处理可能需要再次布局子视图(或调用 setNeedsLayout)的不同时间。

    【讨论】:

    • 感谢您的富有洞察力的评论。我在 iOS 旋转检查之前为视图设置动画,所以这可能会搅动结果?
    【解决方案3】:

    您可以在 [project]-info.plist 文件中重新排序支持的界面方向,将 item 0 的值设置为 Landscape(右主页按钮)。

    【讨论】:

    • 我仍然有这个问题,即使我的 Info.plist 中唯一支持的界面方向是“UIInterfaceOrientationLandscapeRight”。在我看来,这很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2011-01-06
    相关资源
    最近更新 更多