取消隐藏后如何保留堆栈视图子项的约束?
How to retain constraints for a Stack View's child after unhiding?
有一个包含三个标签并具有以下约束的堆栈视图:
- 身高=300
- top = 安全区 + 50
- trailing/leading = 0
以及以下属性:
- 轴 -> 垂直
- 对齐 -> 居中
- 分布 -> 等间距
标签 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 中看到结果...无需在 运行 时等待代码。
有一个包含三个标签并具有以下约束的堆栈视图:
- 身高=300
- top = 安全区 + 50
- trailing/leading = 0
以及以下属性:
- 轴 -> 垂直
- 对齐 -> 居中
- 分布 -> 等间距
标签 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 中看到结果...无需在 运行 时等待代码。