0

我尝试在情节提要中测试 UIStackView,在其中我根据 iPhone 的方向(wAny/hC、wC/hR)更改属性“Axis”。

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

预先感谢您的帮助。

4

1 回答 1

0

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

我还没有尝试过所有可能的排列,但这是我发现的,因为只有在我想引入多个具有这种所需的轴更改行为的堆栈视图时才会出现问题。可能存在单个堆栈视图不遵守大小类规则的情况,但我没有可靠地复制它。

查看我的iOS 9.1 项目,它清楚地展示了垂直排列的 8 个 UIStackView 元素的这个问题。除了它们相对于彼此和屏幕顶部的位置受到限制之外,它们的配置都完全相同。

正如您从情节提要预览中看到的那样,在横向中,事情看起来就像我们想要和期望的那样:

在此处输入图像描述

在模拟器或设备上运行时,情况就不同了。在尝试了许多堆栈视图之后,很明显该错误会影响视图层次结构中的所有其他堆栈视图。

在此处输入图像描述

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

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

根据 EinharchAltPlus在 Apple Developer forums 中的帖子的代码解决方法:

顺便说一句:重写 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
    }
}

如果您想更具体地确定决定行为变化的大小类,只需使用特征集合大小类类型,直到满足您想要的条件。

如果我在错误修复时间表上听到任何反馈,我会在此处发布。在那之前,我希望这有助于作为一种解决方法。

于 2015-10-29T02:12:13.683 回答