取消隐藏后如何保留堆栈视图子项的约束?

How to retain constraints for a Stack View's child after unhiding?

有一个包含三个标签并具有以下约束的堆栈视图:

以及以下属性:

标签 3(蓝色)有一个变体:对于紧凑的高度大小 class 安装的属性被禁用(通过属性检查器配置)。这使得它隐藏在 iPhone:

的水平方向

当应用程序启动时,所有标签在屏幕上的位置都是正确的。旋转到水平方向并返回后,标签 3 位于 Stack View 的左上角,而其他标签正确对齐:

Xcode View Hierarchy 调试器显示标签 3 重新出现后没有任何 UIStackView 相关约束,旁边的警告显示 "Position is ambiguous":

Label 3隐藏再显示后,似乎失去了所有与Stack View相关的约束。

您不能为此使用 installed 属性,因为该 adds/removes 视图指向父视图。这对于 StackView 来说还不够好,因为它需要使用 addArrangedSubview().

添加子视图

一个简单的解决方案是为您的标签创建一个出口,hide/show它在旋转时:

@IBOutlet private var label3: UILabel!

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    super.willTransition(to: newCollection, with: coordinator)

    label3.isHidden = newCollection.verticalSizeClass == .compact
}

一种简单得多的方法 - 在 Hidden 属性.

上设置特征变体

这是您的布局:

Select 底部标签,然后在“属性检查器”窗格中,单击 Hidden 旁边的 + 按钮:

将变体更改为:

您现在有一个新的 Hidden 变体,您可以 select:

这是旋转到 wC hC:

时的结果

如这些图片所示,您甚至可以在 Storyboard 中看到结果...无需在 运行 时等待代码。