【问题标题】:View controller is not extending all the way to the right when rotating iPad旋转 iPad 时,视图控制器没有一直向右延伸
【发布时间】:2015-09-15 20:20:23
【问题描述】:

当我在 iPad 8.4 上旋转视图控制器时,我的视图不会一直向右延伸:

在本例中,红色视图是我的根视图控制器,它永远不可见。我嵌入了一个导航控制器using UIViewController containment,它应该会填满整个屏幕并覆盖红色部分。

为什么会导致这种行为,我该如何解决?

如果我尝试在 iPhone 或 iOS 9 上运行它,它是固定的。

【问题讨论】:

  • 你有没有调用layoutIfNeeded的旋转观察器方法?如果不试试这个。

标签: ios objective-c uiview uiviewcontroller autolayout


【解决方案1】:

我能够用最少的步骤重现问题:

重现问题的步骤(或try this GitHub project):

  1. 在 Xcode 7 中创建一个新项目。
  2. 将目标更改为 iOS 8.4。
  3. 在情节提要中删除视图控制器的视图,然后重新添加。
  4. 更改视图控制器的背景颜色,以便我们可以看到发生了什么。
  5. 将视图控制器嵌入到导航控制器中。
  6. 向视图控制器添加导航项。
  7. 通过将 UIView 拖到情节提要中来添加中心导航项视图。
  8. 添加第二个视图作为刚刚创建的视图的子视图。
  9. 向情节提要添加一个新的视图控制器并将其设置为初始视图控制器。
  10. 在新视图控制器的视图中确实加载了方法,embed the navigation controller using auto layout
  11. 在 iPad Air (8.4) 上纵向运行。
  12. 将 iPad 向右旋转,使其处于横向状态。
  13. 注意红色部分是如何突出到视图之外的。

解决办法:

  • 使用 iOS 9.0
  • 使用 iPhone 代替 iPad
  • 在导航项的中心位置不要有两个视图(单个视图也可以;但是,例如,视图内部的标签会导致这种损坏)。
  • 打开情节提要的 XML 并将视图控制器的视图 autoresizingMask<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 更改为 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>。 (默认情况下,当您将视图控制器拖入情节提要时,它将使用 ...Sizable 变体。但是,如果您删除 view(而不是 view 控制器 ),然后将视图拖回视图控制器,它将使用 flexibleMax... 变体。)
  • 不要使用 UIViewController 容器。
  • 如果您使用 UIViewController 包含,让情节提要嵌入视图控制器。
  • 如果您确实以编程方式使用 UIViewController 包含,请确保将 translatesAutoresizingMaskIntoConstraints 设置为 YES 而不是 NO。如果你比较 auto layout way of embedding a view controller 和 storyboard 嵌入视图控制器的方式,你会看到 storyboard 设置了translatesAutoresizingMaskIntoConstraints=YES,因此,不要尝试设置约束,只需将 translatesAutoresizingMaskIntoConstraints 设置为 YES,然后设置 @ 987654333@,模仿故事板嵌入行为。 (注意,您还可以看到,默认情况下,故事板会将嵌入视图的 autoresize 设置为 W+H,因此您应该确保您的视图具有该设置。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2012-05-15
    • 2019-12-19
    • 2012-03-16
    相关资源
    最近更新 更多