UIStackView属性根据大小类

时间:2015-06-15 17:34:36

标签: xcode ios9 uistackview

我尝试在故事板中测试UIStackView,根据iPhone的方向(wAny / hC,wC / hR)更改属性“Axis”。

不幸的是,在运行时,不会应用更改。 具体来说,属性“Axis”被修改(在Xcode中检查),但布局不会改变。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这绝对是个错误。经过仔细检查后,轴在运行时(模拟器或设备)的行为仅对视图层次结构中的每个其他 UIStackView进行更改。

我没有尝试过所有可能的排列,但这就是我所发现的,因为一旦我想要引入多个具有这种期望的轴变换行为的堆栈视图,问题就会出现。可能存在单个堆栈视图不遵守大小类规则的情况,但我没有可靠地重现它。

查看我的iOS 9.1 project,它以垂直排列方式清楚地演示了8个UIStackView元素的问题。除了相对于彼此和屏幕顶部的位置限制之外,它们都配置为完全

正如您从故事板预览中看到的那样,事物看起来像我们想要的并期望在景观中:

enter image description here

在模拟器或设备上运行时,它会变成另一个故事。在尝试了许多堆栈视图后,很明显该错误会影响视图层次结构中的每个其他堆栈视图。

enter image description here

我已经在这个示例项目中提出了我自己的单独RDAR,尽管在上面的评论中有人提到了另一个。我找不到它的公开记录。

显然,基于代码的解决方法很痛苦,完全违背了自动布局,约束和大小类的目的。这对我来说是一个非常重要的错误,因为它消除了堆栈视图和大小类的一个非常重要的用例。

根据Apple开发者论坛中EinharchAltPlus的post的代码解决方法:

  BTW:覆盖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
    }
}

如果您希望更具体地确定行为更改的大小类,只需使用特征集合大小类类型,直到达到所需条件为止。

如果我在错误修复时间线上听到任何回复,我会在此处发布。在那之前,我希望这有助于解决方法。