向UIStackView添加子视图控制器时内容空间未动态适配
问题分析
你的代码中,子视图控制器(SecondViewController、ThirdViewController)的内部视图(黑色/红色View)仅设置了顶部、左右边缘和高度约束,但缺少与子VC视图底部的约束,导致AutoLayout无法确定子VC视图的完整垂直尺寸。同时,子VC视图的translatesAutoresizingMaskIntoConstraints默认开启,StackView无法从子VC视图获取明确的高度信息,最终导致布局尺寸不符合预期。
解决方案
方案1:完善子VC内部约束,让子VC视图高度由内部View决定
修改子VC的约束,让内部View的底部与子VC视图的底部对齐,结合内部View的高度约束,强制子VC视图的高度等于内部View的高度(100pt)。
以SecondViewController为例:
override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(blackView) blackView.snp.makeConstraints { make in // 让黑色View完全填充子VC视图 make.leading.top.trailing.bottom.equalToSuperview() // 限制黑色View高度为100pt,间接让子VC视图高度固定为100pt make.height.equalTo(100) } }
ThirdViewController做同样修改即可。
方案2:在容器VC中直接给子VC视图添加高度约束
如果不想修改子VC的代码,可以在容器VC添加子视图时,直接给子VC的视图设置固定高度约束:
修改ContainerViewController的loadView方法:
override func loadView() { let mainView = UIView() mainView.addSubview(self.contentStackView) let views = [SecondViewController(), ThirdViewController()] _ = views.map { child in child.willMove(toParent: self) addChild(child) let childView = child.view contentStackView.addArrangedSubview(childView) // 关闭自动约束转换,添加固定高度约束 childView.translatesAutoresizingMaskIntoConstraints = false childView.heightAnchor.constraint(equalToConstant: 100).isActive = true child.didMove(toParent: self) } self.view = mainView }
补充说明
两种方案都能解决问题:
- 方案1更符合组件封装原则,子VC自身明确了自己的尺寸需求;
- 方案2更灵活,适合在容器层统一控制子视图的尺寸。
内容的提问来源于stack exchange,提问作者DRN
相关产品推荐
相关产品推荐

