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

时间:2017-01-21 12:40:58

标签: ios swift uicollectionview constraints uicollectionviewcell

我正在尝试为我的collectionviewcells添加约束。但是当我在其类中使用此代码时,我得到一个控制台错误

class IndexD: UICollectionViewCell {

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

我收到的错误是:

  

无法识别的选择器已发送至课程

我不知道如何更改我的代码以删除任何错误。我的目标是为每个特定的集合视图单元设置约束。

2 个答案:

答案 0 :(得分:1)

views字典中,您传递的视图v0的值不正确。你应该使用self引用类的当前实例而不是引用类本身的IndexD.self

将您的views更改为:

views: ["v0": self]

还有其他问题。您正在将生成的约束添加到self,但是需要将它们添加到视图层次结构中的较高项目。 "H:|[v0]|"会生成涉及superview self的约束,因此您确实需要执行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]))
}

答案 1 :(得分:0)

首先,如果你没有导入UIKit,你应该。并且您需要初始化该类,以便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]))
}

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