在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView

Posted

技术标签:

【中文标题】在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView【英文标题】:Make a UICollectionView in UITableViewCell programmatically in Swift 【发布时间】:2017-08-30 06:16:31 【问题描述】:

我有一个 tableview 单元的子类,其中需要有一个 UICollectionView。我现在在尝试添加 UICollectionView 时遇到问题。它让我添加一个新的 UICollectionView,但我无法设置它的约束。以下是我的代码:

// Add Collection
    let layout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)

    collectionProducts = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)

    contentView.addSubview(collectionProducts)

    let leadingColConstraint = NSLayoutConstraint(item: collectionProducts, attribute: NSLayoutAttribute.leadingMargin, relatedBy: NSLayoutRelation.equal, toItem: contentView, attribute: NSLayoutAttribute.leadingMargin, multiplier: 1, constant: 0)
    let trailingColConstraint = NSLayoutConstraint(item: collectionProducts, attribute: NSLayoutAttribute.trailingMargin, relatedBy: NSLayoutRelation.equal, toItem: contentView, attribute: NSLayoutAttribute.trailingMargin, multiplier: 1, constant: 0)
    let topColConstraint = NSLayoutConstraint(item: collectionProducts, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: lblHeader, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 62)
    let bottomColConstraint = NSLayoutConstraint(item: collectionProducts, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: contentView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 55)

    contentView.addConstraints([leadingColConstraint,trailingColConstraint,topColConstraint,bottomColConstraint])
    collectionProducts.translatesAutoresizingMaskIntoConstraints = false

我错过了什么吗?我是 Swift 的相对较晚的推动者,并且对于以编程方式创建单元格也相对较新。我可以使用 nib 或 storyboard 轻松地做同样的事情,但我被困在这里。请帮忙。

【问题讨论】:

干草 @Mayank Pahuja 检查此链接 youtube.com/watch?v=RxEGlpeONOc 它的帮助已满 【参考方案1】:

也许您可以避免所有这些限制,只需添加视觉格式语言限制,就像这样

contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": collectionProducts]))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[label][v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["label": labelHeader,"v0":collectionProducts]))

并保持collectionProducts.translatesAutoresizingMaskIntoConstraintsfalse

【讨论】:

谢谢!这很好用。 VFL是要走的路。只是对我的代码进行了相应的更改,并在此过程中了解了一些关于 VFL 的知识。非常感谢,它救了我。顺便说一句,知道为什么它不能与我使用的约束一起工作吗?由于我添加了一些具有相同约束的标签并且工作正常,但不知何故不是集合视图。再次感谢! 可能在bottomColConstraint 的属性中你放了“top”而不是“bottom” @MayankPahuja 不用担心!乐于助人! Edu 感谢您指出这一点。用“top”代替“bottom”确实是个问题。我一直在看我的代码很长时间,但无法弄清楚。看不到这么直接的错误盯着我看。 @MayankPahuja 经常发生哈哈

以上是关于在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式启用/禁用菜单对象

如何在swift中以编程方式减少obj文件

在 Swift 中以编程方式创建 UITableViewController

在 Swift 中以编程方式创建 NSTextField

UIScrollView 在 Swift 中以编程方式

在 Swift 中以编程方式突出显示 UITableViewCell