swift 在UIStackView中添加ChildViewControllers未调整的空间及其内容

w46czmvw  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(72)

我正在尝试使用UIStackView将子视图控制器添加到容器视图中。视图被添加,但是内容大小与我期望的其子视图控制器的大小不一样。
我有两个视图SecondViewControllerThirdViewController作为子视图控制器添加到ContainerViewController。但这些观点并不一致。

// ViewController
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func show() {
        let continer = ContainerViewController()
        self.present(continer, animated: true)
    }
}
// ContainerViewController

class ContainerViewController: UIViewController {
    
    private lazy var contentStackView: UIStackView = {
        let view = UIStackView()
        view.axis = .vertical
        view.spacing = 16.0
        return view
    }()
    
    override func loadView() {
        let mainView = UIView()
        mainView.addSubview(self.contentStackView)
        let views =  [SecondViewController(), ThirdViewController()]
        
        _ = views.map { child in
            child.willMove(toParent: self)
            addChild(child)
            contentStackView.addArrangedSubview(child.view)
            child.didMove(toParent: self)
        }
        self.view = mainView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        contentStackView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            contentStackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            contentStackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            contentStackView.topAnchor.constraint(equalTo: self.view.topAnchor),
            contentStackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
        ])

    }
    
    public init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("\(#function) has not been implemented")
    }
}

// SecondViewController

class SecondViewController: UIViewController {
    var blackView: UIView = {
        let view = UIView()
        view.backgroundColor = .black
        return view
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(blackView)
        blackView.snp.makeConstraints { make in
            make.leading.top.trailing.equalToSuperview()
            make.height.equalTo(100)
        }
    }
    
    public init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("\(#function) has not been implemented")
    }
}

class ThirdViewController: UIViewController {
    
    var redView: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        return view
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(redView)
        redView.snp.makeConstraints { make in
            make.leading.top.trailing.equalToSuperview()
            make.height.equalTo(100)
        }
    }
    
    public init() {
        super.init(nibName: nil, bundle: nil)
    }
    
    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("\(#function) has not been implemented")
    }
}

字符串
使用上面的代码,我想显示背面和红色视图,高度为100 px。理想情况下,所有内容都与子视图控制器一起存在。
这里我们可以看到当前的输出。
x1c 0d1x的数据
提前感谢!!

nwwlzxa7

nwwlzxa71#

make.leading.top.trailing.equalToSuperview()应该替换为make.edges.equalToSuperview(),以帮助控制器的视图计算它们的大小。由于只有三个侧面受到限制,他们无法理解他们必须与彩色视图的高度相匹配。此外,如果任务是显示这两个具有固定高度的控制器,那么这里可能应该是另一个底部工作表,与其内容大小相匹配,或者是堆栈视图的灵活底部约束,以便在内容较小时占用更少的空间。

相关问题