如何以编程方式将笔尖添加到 UIStackView

Posted

技术标签:

【中文标题】如何以编程方式将笔尖添加到 UIStackView【英文标题】:How to add nibs to a UIStackView programmatically 【发布时间】:2018-07-28 12:29:23 【问题描述】:

我正在尝试将任意数量的视图从笔尖添加到 UIStackView 中。问题是,比如说,如果只包含一个视图,该视图会增长以填充整个堆栈视图,而不是保持适当的宽度。到目前为止,这是我的代码:

friendStackView.autoresizingMask = .flexibleWidth
friendStackView.translatesAutoresizingMaskIntoConstraints = false

let friendView = Bundle.main.loadNibNamed("FriendView", owner: self, options: nil)?.first as! FriendViewController
friendStackView.addArrangedSubview(friendView)
friendView.heightAnchor.constraint(equalToConstant: 150).isActive = true
friendView.widthAnchor.constraint(equalToConstant: 120).isActive = true

它会导致以下调试:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x14eb9eb0 UIStackView:0x14ee6ed0.width == 500   (active)>",
    "<NSLayoutConstraint:0x14ef83f0 XXX.FriendViewController:0x14ef2090.width == 120   (active)>",
    "<NSLayoutConstraint:0x14def090 'UISV-canvas-connection' UIStackView:0x14ee6ed0.leading == XXX.FriendViewController:0x14ef2090.leading   (active)>",
    "<NSLayoutConstraint:0x14def230 'UISV-canvas-connection' H:[XXX.FriendViewController:0x14ef2090]-(0)-|   (active, names: '|':UIStackView:0x14ee6ed0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x14ef83f0 XXX.FriendViewController:0x14ef2090.width == 120   (active)>

【问题讨论】:

【参考方案1】:

你在这里有一个冲突,stackView width = 500,你试图给子视图应该填满整个宽度 120

"<NSLayoutConstraint:0x14eb9eb0 UIStackView:0x14ee6ed0.width == 500   (active)>",
"<NSLayoutConstraint:0x14ef83f0 XXX.FriendViewController:0x14ef2090.width == 120 

【讨论】:

填充整个宽度的指令在哪里?为什么最后不能留空间? Prgrammatically 或 IB ,添加你给它的约束 stack view 的宽度为 500,到 superview 的 trailing-trailing-bottom-top 空间为 0。与超级视图等高,它是一个滚动视图(方向是水平的)。理想情况下,我只希望 stackview 是包含子视图所需的最小宽度。 知道了!移除了宽度约束并调用了 sizeToFit() 只给它 top ,leading 和 height ,当你添加一个子视图时给它一个没有高度的宽度,还要注意当子视图总宽度超过屏幕宽度时你将无法滚动,所以考虑将其插入到 scrollview 中,或者使用 collectionView 代替

以上是关于如何以编程方式将笔尖添加到 UIStackView的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式向 UIStackView 添加安全区域布局?

在 Swift 4 中以编程方式将 UIImageView、UILabel 添加到 UIStackView

以编程方式将一堆自定义视图从 XIB 添加到 UIStackView

如何向放置在 UIStackView 中的以编程方式创建的 UIButton 添加约束

如何以编程方式快速向 UITableViewCell 内的 UIStackView 添加约束?

以编程方式清空 UIStackView