这绝对是一个错误。轴在运行时(模拟器或设备)的行为,经过仔细检查后,仅针对视图层次结构中的每个 other UIStackView 发生变化。
我没有尝试所有可能的排列,但这是我发现的,因为只有在我想引入多个具有这种所需的轴更改行为的堆栈视图时才会出现此问题。可能存在单个堆栈视图不遵守大小类规则的情况,但我没有可靠地复制它。
查看我的iOS 9.1 project,它清楚地展示了垂直排列的 8 个 UIStackView 元素的这个问题。除了相对于彼此和屏幕顶部的位置受到限制之外,它们的配置都完全相同相同。
正如您从情节提要预览中看到的那样,在横向中,事情看起来与我们想要和期望的一样:
在模拟器或设备上运行时,情况就不同了。在尝试了许多堆栈视图之后,很明显该错误会影响视图层次结构中的每个其他堆栈视图。
尽管在上面的 cmets 中提到了另一个,但我已经通过这个示例项目提出了我自己的单独 RDAR。我找不到它的公开记录。
显然,有一个基于代码的解决方法是痛苦的,并且完全违背了自动布局、约束和大小类的目的。这对我来说是一个非常大的错误,因为它消除了堆栈视图和大小类的一个非常重要的用例。
根据 EinharchAltPlus 在 Apple 开发者论坛中的 post 的代码解决方法:
顺便说一句:重写 viewWillTransitionToSize 并手动设置不同的参数可以解决问题,但这很烦人,因为我们还需要在代码中检查视图,这应该是纯粹与设计相关的。
如果不完全清楚,您需要有一个 IBOutlet 对非协作堆栈视图的引用,也许还有它在您的视图控制器代码中填充的视图。您可以更改堆栈视图的轴属性,理想情况下,它包含在其中的高度:
@IBOutlet weak var viewHackStack: UIView!
@IBOutlet weak var hackStackView: UIStackView!
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if(self.traitCollection.verticalSizeClass == .Compact) {
self.viewHackStack.frame.size.height = 25
self.hackStackView.axis = .Horizontal
}
else if(self.traitCollection.verticalSizeClass == .Regular) {
self.viewHackStack.frame.size.height = 50
self.hackStackView.axis = .Vertical
}
}
如果您想更具体地确定决定行为变化的大小类,只需使用 trait 集合大小类类型,直到满足您想要的条件。
如果我在错误修复时间表上听到任何消息,我会在此处发布。在此之前,我希望这有助于解决问题。