嵌套的 UIStackViews 在编程 UI 中不起作用

Posted

技术标签:

【中文标题】嵌套的 UIStackViews 在编程 UI 中不起作用【英文标题】:Nested UIStackViews not working in programmatic UI 【发布时间】:2018-02-06 20:38:34 【问题描述】:

我在具有 4 个水平子视图(行)的 mainStackView (UIStackView) 中工作,它工作正常,如下所示(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)

现在,考虑到每个子视图(在本例中为行)将有许多水平子视图,我需要将arrangedSubviews 设置为数组,但它无法显示任何子视图。

    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】:

这不是错误,它就是这样设计的,请阅读以下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,我已经使用了相当长的时间没有问题,所以我相信这是一种方法。

【讨论】:

谢谢@Milan Nosál'。做了一些休息,我发现框架在调试器中布局正确,并且 UIStackView 的 backgroundColor 属性为零....当我看到你的答案时。这是有道理的......添加一个容器视图应该可以解决它。谢谢....

以上是关于嵌套的 UIStackViews 在编程 UI 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束?

如何控制嵌套在另一个堆栈视图中的 UIStackViews 的相对宽度?

UIScrollView 内的嵌套 UIStackViews:不填充容器的宽度?

UILabel 在嵌套的 UIStackViews 中被截断?

UIStackView 内的 UIStackViews 给出错误

从嵌套的 UIView 获取框架