防止旋转UIView子视图,允许旋转兄弟子视图

时间:2016-03-06 05:58:34

标签: ios uiview uiviewcontroller size-classes

我有一个UIViewController,其中包含一对UIView和一个UILabel,并且全屏显示,嵌入UINavigationController。在非紧凑的高度环境(肖像)中,我希望盒子堆叠在一起,标签位于下方 - 这正如预期的那样工作。现在,当旋转到紧凑的高度环境(风景)时,视图当然会重新定位,因此框现在宽度增加并且高度减小。我不希望这种行为。相反,我想总是将盒子放在盒子里,好像iPhone是纵向的,但是标签应该像导航栏一样旋转,以便它在当前方向上保持可读性。 (这意味着由于导航栏,视图的高度在这种情况下会更加紧缩。)

图片有助于更好地解释:

enter image description here

所以问题是,如何在UIView仍然支持横向定位时阻止旋转特定UIViewController

我见过其他类似的问题,但他们使用了不常用的方法来检测特定设备方向的旋转,这与iOS 8+无关。这个问题是在考虑大小等级时如何实现这一点。我相信该解决方案将使用viewWillTransitionToSizeanimateAlongsideTransition,但我确切需要做的事情并不完全清楚。

在这种情况下我使用的是帧布局,而不是自动布局。所有视图都以编程方式创建。这些框实际上是UIView子类的子视图,它根据父视图的框架布局并在框中绘制内容。

UIViewController

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let topPosition = self.topLayoutGuide.length
    boxesContainer.frame = CGRectMake(20, topPosition, self.view.frame.size.width - 40, (self.view.frame.size.height - topPosition) / 1.5)

    boxesContainer.updateLayout()
}

在框容器UIView中:

func updateLayout() {
    box1.frame = // something based on self.frame
    box2.frame = // ...
}

1 个答案:

答案 0 :(得分:0)

我制定了一个解决方案。基本上我检测视图的宽度是否大于高度,如果是这样,则旋转包含框的视图。首次显示视图控制器时以及大小更改时执行此操作。然后进行计算以根据需要更新该视图的帧。重要的是,框容器视图使用其minframe.size.width的{​​{1}}来放置框。

frame.size.height