Swift 3中Storyboard约束:视图切换与Scroll View高度调整问题
解决Storyboard中ScrollView动态适配红/蓝视图高度的问题
我刚好遇到过类似的布局场景,给你两个实用的方案,都能完美解决你的需求:
方案一:用UIStackView简化布局(推荐)
这是最省心的方法,利用StackView自动管理子视图的显示与空间占用:
- 在ScrollView内部添加一个垂直方向的UIStackView,设置它的
Alignment为Fill,Distribution为Fill,Spacing根据需要调整。
- 在ScrollView内部添加一个垂直方向的UIStackView,设置它的
- 把红色视图和蓝色视图直接拖入这个StackView中。
- 给StackView添加约束:
- 绑定
top、leading、trailing、bottom到ScrollView的Content Layout Guide; - 给StackView添加一个
Width约束,等于ScrollView的Frame Layout Guide的Width(避免ScrollView出现横向滚动)。
- 代码中动态控制显示:
StackView会自动隐藏已设置// 显示红色视图时 redView.isHidden = false blueView.isHidden = true // 显示蓝色视图时 redView.isHidden = true blueView.isHidden = falseisHidden = true的视图,并且不占用任何空间,ScrollView的高度会自动适配当前显示视图的内容高度。
方案二:通过约束优先级动态调整(适合不想用StackView的场景)
如果你的布局结构比较特殊,不适合用StackView,可以通过约束优先级来强制控制红色视图的高度:
- 给红色视图添加一个高度约束,默认
Constant设为0,Priority设为低优先级(比如250)。
- 给红色视图添加一个高度约束,默认
- 调整红色视图的内容拥抱优先级(Content Hugging Priority),把垂直方向的优先级设为最高(1000),确保它会根据内部组件自动撑开高度。
- 给这个高度约束创建一个IBOutlet关联(比如命名为
redViewHeightConstraint)。
- 给这个高度约束创建一个IBOutlet关联(比如命名为
- 代码中动态切换:
// 显示红色视图时:降低高度约束优先级,让视图根据内容自动撑开 redViewHeightConstraint.priority = .defaultLow redView.isHidden = false blueView.isHidden = true // 显示蓝色视图时:提高高度约束优先级,强制把红色视图高度设为0 redViewHeightConstraint.priority = .required redView.isHidden = true blueView.isHidden = false
关键注意点
不管用哪个方案,一定要确保ScrollView的约束设置正确:
- 给ScrollView本身添加
top、leading、trailing、bottom约束绑定到父视图; - 内部容器(StackView或红/蓝视图的父容器)必须和ScrollView的
Content Layout Guide做四边约束,这样ScrollView才能正确计算contentSize。
内容的提问来源于stack exchange,提问作者Mamta
相关产品推荐
相关产品推荐

