以编程方式向 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]|"
将生成涉及 self
的 superview
的约束,因此您确实需要执行 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]))
}
我正在尝试向我的 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]|"
将生成涉及 self
的 superview
的约束,因此您确实需要执行 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]))
}