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

Posted

技术标签:

【中文标题】如何以编程方式快速向 UITableViewCell 内的 UIStackView 添加约束?【英文标题】:How to add constraints to UIStackView inside of a UITableViewCell swift programmatically? 【发布时间】:2017-01-20 22:28:12 【问题描述】:

我有一个函数可以创建一个数组UIStackViews,其中包含UIButtons

func generateStackViews() -> [UIStackView] 
    var stackViewArray = [UIStackView]()
    let finalButtonArray = generateButtons()
    for buttons in finalButtonArray
        stackViewArray.append(createStackView(subViews: buttons))
    
    return stackViewArray

然后我将该数组添加到 tableViewCell:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "First")!
    cell.contentView.addSubview(generateStackViews()[indexPath.row])
    return cell

一切正常,但是当我尝试添加约束以将 stackViews 固定到单元格时,我收到此错误:

失败 -[UITableViewCell _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:]

我尝试在创建stackViews 的函数和cellForRowAt 函数中添加约束,尝试将其固定到contentView、单元格和tableView,但都不起作用,我得到了同样的错误消息。

我的逻辑哪里出错了?

【问题讨论】:

【参考方案1】:

以编程方式调用此方法以添加约束。

func addSubviewWithConstraint(to parentView: UIView, and childView: UIView, top:CGFloat, bottom:CGFloat, leading:CGFloat, trailing:CGFloat) 
    parentView.addSubview(childView)
    //Below line tells the view to not use AutoResizing
    childView.translatesAutoresizingMaskIntoConstraints = false
    // set top constraint
    let topConstraint = NSLayoutConstraint(item: childView, attribute: .top, relatedBy: .equal, toItem: parentView, attribute: .top, multiplier: 1, constant: top)
    // set Bottom constraint
    let bottomConstraint = NSLayoutConstraint(item: childView, attribute: .bottom, relatedBy: .equal, toItem: parentView, attribute: .bottom, multiplier: 1, constant: bottom)
    // set leading constraint
    let leadingConstraint = NSLayoutConstraint(item: childView, attribute: .leading, relatedBy: .equal, toItem: parentView, attribute: .leading, multiplier: 1, constant: leading)
    // set Bottom constraint
    let trailingConstraint = NSLayoutConstraint(item: childView, attribute: .trailing, relatedBy: .equal, toItem: parentView, attribute: .trailing, multiplier: 1, constant: trailing)
    //Add all constraints to parentView
    parentView.addConstraint(topConstraint)
    parentView.addConstraint(bottomConstraint)
    parentView.addConstraint(leadingConstraint)
    parentView.addConstraint(trailingConstraint)

然后像这样调用上面的方法。

self.addSubviewWithConstraint(to: cell.contenetView, and: stackView, top: 0, bottom: 0, leading: 0, trailing: 0)

【讨论】:

非常感谢,这很有帮助。我是初学者,所以如果你能解释这背后的逻辑,将不胜感激

以上是关于如何以编程方式快速向 UITableViewCell 内的 UIStackView 添加约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式快速发送 pangesture

如何以编程方式快速制作 UIProgressBar

如何以编程方式快速创建 uicollectionview(没有情节提要)

Avalonia:如何以编程方式向 UserControl 添加控件

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

如何以编程方式快速切换到暗模式