Ios Swift:堆栈视图未显示完整的子视图

Ios Swift:堆栈视图未显示完整的子视图,ios,swift,stack,uistackview,xcode11.4,Ios,Swift,Stack,Uistackview,Xcode11.4,我有一个子视图: 下面是该视图的子类: class MyView: UIView { public init(){ super.init(frame: .zero) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } 在主视图控制器上,我有一个stackView: 如果将单个视图添加到堆栈视图: override fu

我有一个子视图:

下面是该视图的子类:

class MyView: UIView {
    public init(){
        super.init(frame: .zero)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
在主视图控制器上,我有一个stackView:

如果将单个视图添加到堆栈视图:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    generaRedView()
}

func generaRedView() {
    let newView = MyView()
    newView.backgroundColor = .red
    stackView.addArrangedSubview(newView)
}
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        generaRedView()
        generaBlueView()
    }
    
    func generaRedView() {
        let newView = MyView()
        newView.backgroundColor = .red
        stackView.addArrangedSubview(newView)
    }
    
    func generaBlueView() {
        let newView = MyView()
        newView.backgroundColor = .blue
        stackView.addArrangedSubview(newView)
    }
看起来很好:

但我在堆栈视图中添加了两个视图:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    generaRedView()
}

func generaRedView() {
    let newView = MyView()
    newView.backgroundColor = .red
    stackView.addArrangedSubview(newView)
}
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        generaRedView()
        generaBlueView()
    }
    
    func generaRedView() {
        let newView = MyView()
        newView.backgroundColor = .red
        stackView.addArrangedSubview(newView)
    }
    
    func generaBlueView() {
        let newView = MyView()
        newView.backgroundColor = .blue
        stackView.addArrangedSubview(newView)
    }
已压缩子视图:

我想问你们的问题是,如何使堆栈视图尊重子视图的大小,并增加堆栈视图的高度,使子视图看起来正常,而不是压缩


非常感谢您的帮助。

您需要考虑两件事:

  • 红色和蓝色
    视图的高度和宽度是多少?在你的问题中包含的代码没有显示这些<代码>视图<代码>有任何<代码>帧你设置的不是<代码> > 0 < /代码>所以首先你需要给他们适当的高度来考虑<代码> uistaVIEW/<代码> 

  • 您需要设置
    UIStackView
    分发
    。。如何在
    stackView
    中分配视图
    ,并设置堆栈的
    约束
    ,使其不固定高度。。如果您固定
    UIStackView
    高度,它将尝试在该高度内布局子视图

  • 因此,您需要的是为视图提供高度
    约束
    ,并设置
    堆栈视图的
    分布
    ,而不是固定的
    高度约束

    func generaRedView() {
            let newView = MyView()
            newView.backgroundColor = .red
    
            newView.translatesAutoresizingMaskIntoConstraints = false
            newView.widthAnchor.constraint(equalToConstant: 100).isActive = true
            newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
            stackView.addArrangedSubview(newView)
        }
    

    这就是您为视图设置约束的方式。。。。并移除stackView的固定高度约束

    首先创建一个方法来创建
    MyView
    实例。其次,在将
    newView
    添加到
    stackView
    之前,向其添加高度
    约束,即

    func generateView(with color: UIColor, height: CGFloat) {
        let newView = MyView()
        newView.backgroundColor = color
        newView.translatesAutoresizingMaskIntoConstraints = false
        newView.heightAnchor.constraint(equalToConstant: height).isActive = true //here....
        stackView.addArrangedSubview(newView)
    }
    
    您可以调用上面的方法,如

    generateView(with: .red, height: 80.0)
    generateView(with: .blue, height: 180.0)
    
    屏幕截图:


    您是否正确配置了stackView?请共享您的全部代码。您必须添加要添加到StackView的子视图的高度。如果你不想定义子视图的高度,也可以给StackView指定静态高度。你能发布并举例吗?没有火箭科学先生。。。你能给你的视图高度限制吗?