Swift:隐藏子视图后如何正确获取UIStackView高度以适配UIScrollView?
正确获取UIStackView动态高度的方法
你遇到的问题其实很常见——在viewDidLoad()里获取stackView.frame.height时,视图的布局流程还没走完,所以拿到的始终是Storyboard里设置的初始静态高度,根本没反映子视图隐藏后的变化。下面给你几个靠谱的解决方案:
1. 选对获取高度的时机:viewDidLayoutSubviews
视图的布局完成后会调用viewDidLayoutSubviews,这时候frame才会更新到最新状态。不过要注意这个方法会被多次触发(比如屏幕旋转、视图大小变化时),所以如果只需要在子视图隐藏后调整,最好配合一个标记或者只在特定场景下执行:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 可以加个判断,比如只在子视图状态变化后才执行 let updatedHeight = stackView.frame.height scrollView.contentSize = CGSize(width: scrollView.frame.width, height: updatedHeight) }
2. 优先使用intrinsicContentSize获取内在高度
UIStackView本身是基于内在尺寸布局的,它的intrinsicContentSize.height会自动根据子视图的显示/隐藏状态计算真实高度,比依赖frame更可靠。同样要确保在布局完成后获取,或者在修改子视图状态后强制刷新布局:
// 当你隐藏某个子视图后: subView.isHidden = true // 强制栈视图立即更新布局 stackView.layoutIfNeeded() // 获取最新的内在高度 let stackHeight = stackView.intrinsicContentSize.height // 更新滚动视图的contentSize scrollView.contentSize = CGSize(width: scrollView.bounds.width, height: stackHeight)
3. 用自动布局让滚动视图自动适配(更推荐)
如果你的UIScrollView和UIStackView是用自动布局约束的,可以直接让滚动视图的contentSize由栈视图的尺寸来驱动,完全不用手动计算高度:
- 给UIStackView添加顶部、底部、左侧、右侧约束,和UIScrollView的contentView(或直接和scrollView,iOS11+)对齐
- 设置栈视图的宽度等于滚动视图的宽度(避免横向滚动)
- 这样当子视图隐藏时,栈视图的高度自动变化,滚动视图的contentSize也会跟着自动更新,根本不用手动计算!
这样处理后,你就再也不用纠结怎么获取正确的栈视图高度了,布局系统会帮你搞定一切~
内容的提问来源于stack exchange,提问作者Khoury
相关产品推荐
相关产品推荐

