如何在代码添加子视图后更新UIStackView的尺寸?
核心原因
UIStackView 依赖 Auto Layout 完成布局,你遇到的问题本质是子视图没有提供明确的尺寸约束,导致 stack view 无法计算自身的内容尺寸。
当你把视图添加为 UIStackView 的 arrangedSubview 时,stack view 会自动将该视图的 translatesAutoresizingMaskIntoConstraints 设为 false,你之前给 innerView 设置的 frame 会直接失效,stack view 没有可用的尺寸参考,自然宽高都是 0。
解决方法
场景1:让 stack view 自适应子视图尺寸(推荐)
给 innerView 添加明确的宽高约束,stack view 会自动根据子视图的约束计算自身的 intrinsicContentSize,不需要手动设置 stack view 的宽高:
let innerView = UIView() innerView.translatesAutoresizingMaskIntoConstraints = false // 给子视图添加固定宽高约束 NSLayoutConstraint.activate([ innerView.widthAnchor.constraint(equalToConstant: 50), innerView.heightAnchor.constraint(equalToConstant: 50) ]) let outerSV = UIStackView(arrangedSubviews: [innerView]) outerSV.translatesAutoresizingMaskIntoConstraints = false // 此时outerSV的固有尺寸已经是50*50,添加到父视图时只需要设置位置约束即可,不需要设置宽高 // 如果需要立即获取frame,可调用sizeToFit手动触发尺寸更新 outerSV.sizeToFit() print(outerSV.frame.width) // 输出50 print(outerSV.frame.height) // 输出50
场景2:手动指定 stack view 尺寸
如果你不需要自适应内容,可以直接给 stack view 设置固定 frame,注意此时要保留 translatesAutoresizingMaskIntoConstraints 为默认的 true:
let innerView = UIView(frame: .init(x: 0, y: 0, width: 50, height: 50)) let outerSV = UIStackView(arrangedSubviews: [innerView]) // 手动设置stack view尺寸 outerSV.frame = CGRect(x: 0, y: 0, width: 50, height: 50) print(outerSV.frame.width) // 输出50
如果 stack view 已经添加到父视图上,修改完子视图约束后需要立即更新布局,调用 outerSV.layoutIfNeeded() 即可触发立即刷新尺寸。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

