以编程方式向 collectionViewCell 添加约束?

Programmatically add constraints to collectionViewCell?

我正在尝试向我的 collectionviewcells 添加约束。但是当我在它的 class 中使用这段代码时,我得到一个控制台错误

class IndexD: UICollectionViewCell {

func contstraints() {
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self]))
}
}

我收到的错误是:

unrecognized selector sent to class

我不确定如何更改我的代码以消除任何错误。我的目标是为每个特定的 collectionviewcell 设置约束。

首先,如果您还没有导入 UIKit,您应该导入。您需要初始化 class 以便 CollectionCell 知道在哪里执行您的函数。您的代码应如下所示..

import UIKit

class IndexD: UICollectionViewCell {

override init(frame: CGRect) {
    super.init(frame: frame)

    addContstraints()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}


func addContstraints() {
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": IndexD.self]))
}

我更改了您的方法名称,因为当您尝试在 override init 中执行它时,Swift 将您的方法称为 [NsLayoutConstraints] 并造成混淆。

在您的 views 字典中,您为视图 v0 传递了错误的值。您应该使用 self 来引用 class 的当前实例,而不是 IndexD.self 来引用 class 本身。

将您的 views 更改为:

views: ["v0": self]

还有其他问题。您正在将生成的约束添加到 self,但需要将它们添加到视图层次结构中的较高项。 "H:|[v0]|" 将生成涉及 selfsuperview 的约束,因此您确实需要执行 superview?.addConstraints(....

从 iOS 8 开始,有一种更简单的方法来激活约束。您可以将它们的 isActive 属性 设置为 true,它们将自动添加到适当的视图中。如果要激活多个约束,则可以使用一组约束调用 NSLayoutContraint.activate(),iOS 将激活所有约束。

如果没有NSLayoutFormatOptions,就传[]。而且,由于这是该参数的默认值,您可以完全不使用 options: []

考虑到所有这些,这里是您的代码的更正版本:

func contstraints() {
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", metrics: nil, views: ["v0": self]))
}