代码实现Auto Layout组件扩展:隐藏中间组件后布局调整求助
解决三组件布局:隐藏中间组件后让左右占满空间的简便方案
嘿,我明白你遇到的问题了——之前直接改中间组件的宽度constant为0没用,是因为等宽约束是三个组件互相绑定的,改中间的宽度会把另外两个也拉成0,这肯定不是你想要的效果。下面给你两个最简便的实现方案,选一个适合你的就行:
方案一:用UIStackView(最省心,推荐!)
这是苹果官方推荐的布局方式,完全不用手动折腾约束:
- 把三个组件放进一个水平UIStackView里,设置以下属性:
Axis:Horizontal(水平方向)Distribution:Fill Equally(等宽分配)Spacing:根据你的设计需求设置间距(如果不需要可以设为0)
- 当需要隐藏中间组件时,只需要一行代码:
StackView会自动帮你调整布局,让剩下的左右两个组件平分整个父视图的宽度;恢复显示时再把middleView.isHidden = trueisHidden设为false就行,全程不用碰约束!
方案二:手动修改约束(如果你不想用StackView)
如果已经用了单独的等宽约束布局,可以通过切换约束的激活状态来实现:
- 提前准备两组约束:
- 正常状态:三个组件的互相等宽约束(比如
left.width == middle.width、middle.width == right.width),设置为默认激活。 - 隐藏中间组件状态:给左右组件添加
left.width == right.width,以及left.width == parentView.width * 0.5(或者right.width == parentView.width * 0.5,二选一就行),默认设为禁用。
- 正常状态:三个组件的互相等宽约束(比如
- 切换状态时的代码:
这里的// 隐藏中间组件 func hideMiddleView() { // 禁用原等宽约束 equalWidthConstraints.forEach { $0.isActive = false } // 激活新的平分约束 halfWidthConstraints.forEach { $0.isActive = true } middleView.isHidden = true } // 恢复显示中间组件 func showMiddleView() { halfWidthConstraints.forEach { $0.isActive = false } equalWidthConstraints.forEach { $0.isActive = true } middleView.isHidden = false }equalWidthConstraints是你在Interface Builder里拖到代码里的原等宽约束数组,halfWidthConstraints是提前创建好的平分约束数组。
为什么之前改constant没用?
因为等宽约束是双向约束,你设置middleView.widthConstraint.constant = 0时,另外两个组件的宽度会被约束强制拉成0,这和你想要的左右扩展完全相反,所以这个方法行不通哦。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

