我有一个UIViewController
,其中包含一对UIView
和一个UILabel
,并且全屏显示,嵌入UINavigationController
。在非紧凑的高度环境(肖像)中,我希望盒子堆叠在一起,标签位于下方 - 这正如预期的那样工作。现在,当旋转到紧凑的高度环境(风景)时,视图当然会重新定位,因此框现在宽度增加并且高度减小。我不希望这种行为。相反,我想总是将盒子放在盒子里,好像iPhone是纵向的,但是标签应该像导航栏一样旋转,以便它在当前方向上保持可读性。 (这意味着由于导航栏,视图的高度在这种情况下会更加紧缩。)
图片有助于更好地解释:
所以问题是,如何在UIView
仍然支持横向定位时阻止旋转特定UIViewController
?
我见过其他类似的问题,但他们使用了不常用的方法来检测特定设备方向的旋转,这与iOS 8+无关。这个问题是在考虑大小等级时如何实现这一点。我相信该解决方案将使用viewWillTransitionToSize
和animateAlongsideTransition
,但我确切需要做的事情并不完全清楚。
在这种情况下我使用的是帧布局,而不是自动布局。所有视图都以编程方式创建。这些框实际上是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 = // ...
}
答案 0 :(得分:0)
我制定了一个解决方案。基本上我检测视图的宽度是否大于高度,如果是这样,则旋转包含框的视图。首次显示视图控制器时以及大小更改时执行此操作。然后进行计算以根据需要更新该视图的帧。重要的是,框容器视图使用其min
和frame.size.width
的{{1}}来放置框。
frame.size.height