在ViewController中创建StackView因约束锚点问题崩溃求助
问题解决:UIStackView约束崩溃(无共同祖先)
崩溃原因
你定义的stackView是计算属性,每次访问这个属性都会创建一个全新的UIStackView实例:
- 执行
view.addSubview(stackView)时,创建了第一个StackView并添加到视图层级 - 执行
stackView.anchors(...)时,又创建了第二个StackView,这个实例并没有被添加到任何视图中,所以它和safeAreaLayoutGuide没有共同的视图祖先,触发约束异常
同理你的scrollView也存在同样的问题,只是本次代码未用到它。
修复方案
把计算属性改成存储属性,确保每次访问都是同一个实例:
方式1:直接初始化存储属性
import UIKit import Firebase class Vc: UIViewController { let scrollView: UIScrollView = { let scroll = UIScrollView() scroll.isScrollEnabled = true return scroll }() let stackView: UIStackView = { let stack = UIStackView() stack.axis = .vertical stack.distribution = .fillEqually stack.translatesAutoresizingMaskIntoConstraints = false // 禁用自动约束转换,避免冲突 return stack }() override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.tintColor = .white self.navigationItem.title = "Profile" self.view.backgroundColor = .white addStackViewAnchors() } func addStackViewAnchors() { view.addSubview(stackView) NSLayoutConstraint.activate([ stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), stackView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor), stackView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor) ]) } }
方式2:使用lazy var(适合依赖其他属性初始化的场景)
lazy var stackView: UIStackView = { let stack = UIStackView() stack.axis = .vertical stack.distribution = .fillEqually stack.translatesAutoresizingMaskIntoConstraints = false return stack }()
额外注意
- 所有通过Auto Layout设置约束的视图,必须设置
translatesAutoresizingMaskIntoConstraints = false,否则系统会自动生成约束,与手动设置的约束发生冲突 - 除非确实需要每次访问都生成新实例,否则不要用计算属性创建UI组件
内容的提问来源于stack exchange,提问作者Zach Wilcox
相关产品推荐
相关产品推荐

