以编程方式将视图添加到垂直堆栈视图打破了垂直堆栈视图的约束

Posted

技术标签:

【中文标题】以编程方式将视图添加到垂直堆栈视图打破了垂直堆栈视图的约束【英文标题】:Programmatically adding views to Vertical Stack View breaks constraints of vertical stack view 【发布时间】:2017-02-27 14:06:09 【问题描述】:

所以我有一个简单布局的垂直堆栈视图。当我通过 Interface Builder 添加视图时,我看到堆栈视图中的视图没有问题。

当我以编程方式将视图添加到 UIStackView 时,它会打破约束,添加的视图会出现在窗口顶部。我很困惑为什么它会打破堆栈视图的约束。

 func buildCats(theJson:JSON)
     //self.verticalStack.subviews.forEach( $0.removeFromSuperview() )
    print(theJson)
    if let infos = self.swiftyJsonvar["info"].array
        for info in infos
            guard let v = UINib(nibName: "ticketOrderView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as? UIView else  return 
            v.translatesAutoresizingMaskIntoConstraints = false
            self.verticalStack.addArrangedSubview(v)

        
    

【问题讨论】:

我认为这可能是因为您使用以下行禁用了视图的自动布局:v.translatesAutoresizingMaskIntoConstraints = false。所以虽然堆栈视图有自动布局,但新视图没有 我通过 IB 输入的视图没有自动布局。它只是由stackview处理。我删除了该行并尝试将其设置为 TRUE 并每次都获得相同的行为。 您不为此使用 tableview 是否有特定原因?您可以为此设计一个带有自己约束的表格单元 我没有以编程方式使用堆栈视图,但我很确定添加的视图需要布局约束(顶部、底部、前导和尾随) 【参考方案1】:

添加的子视图需要约束,因为它们没有固有大小。试试:

v.heightAnchor.constraint(greaterThanOrEqualToConstant: 30).isActive = true v.widthAnchor.constraint(greaterThanOrEqualToConstant: 200).isActive = true

嗯....我现在对此表示怀疑...我怀疑这个问题可能与在后台线程上添加视图有关。也许在主线程上运行循环?

编辑2:啊...我现在打赌的问题与您对“ticketOrderView”中的视图/子视图所做的事情有关

例如,请参阅:https://github.com/DonMag/ScratchPad

【讨论】:

以上是关于以编程方式将视图添加到垂直堆栈视图打破了垂直堆栈视图的约束的主要内容,如果未能解决你的问题,请参考以下文章

尝试以编程方式使用嵌套的 Stack 视图制作网格

如何将固定高度视图添加到垂直堆栈视图?

使用 xamarin.ios c# 以编程方式添加嵌套的堆栈视图

水平堆栈视图新行 - Swift

自我调整 UITableViewCell 变小

以编程方式填充 UIStackView