嵌套的UIStackViews无法在程序化用户界面

时间:2018-02-06 20:38:35

标签: ios uiview uistackview

我在mainStackView(UIStackView)中工作,它有4个水平子视图(行),它工作正常如下(mainStackView使用AutoLayout约束进行管理):

    rowsArray = Array<UIView>()
    for _ in 0...3 {
        let row = UIView()
        row.backgroundColor = UIColor.randomColor() //color for debugging
        rowsArray.append(row)
    }

    mainStackView = UIStackView(arrangedSubviews: rowsArray)
    mainStackView.axis = .vertical
    mainStackView.alignment = .fill
    mainStackView.distribution = .fillEqually
    mainStackView.translatesAutoresizingMaskIntoConstraints = false
    self.addSubview(mainStackView)

现在,鉴于每个子视图(在这种情况下为行)中将包含许多水平子视图,我需要arrangeSubviews为Array,但它无法显示任何子视图。

    rowsArray = Array<UIStackView>()
    for _ in 0...3 {
        let row = UIStackView()
        row.backgroundColor = UIColor.randomColor() //color for debugging
        rowsArray.append(row)
    }

任何想法为什么UIStackView不像超类(UIView)那样,或者是否有任何其他考虑以编程方式嵌套UIStackViews

Rgds ... e

1 个答案:

答案 0 :(得分:1)

这不是一个错误,它的设计就是这样,请阅读以下docs的摘录,管理堆栈视图的外观

  

UIStackView是UIView的非渲染子类;也就是说,它不提供自己的任何用户界面。相反,它只管理其排列视图的位置和大小。因此,某些属性(如backgroundColor)对堆栈视图没有影响。

这意味着UIStackView不是经典UIView,而是布局其子视图的一个很好的界面。创建没有排列子视图的UIStackView是没有意义的(这是你的情况)。

为您创建的行添加子视图,将其背景颜色设置为红色,您将看到:

rowsArray = Array<UIStackView>()
for _ in 0...3 {
    let row = UIStackView()
    let view = UIView()
    view.backgroundColor = UIColor.randomColor() //color for debugging
    row.addArrangedSubview(view)
    rowsArray.append(row)
}

关于嵌套的stackViews,我已经使用了很长时间没有问题,所以我相信这是一种方法。