首页 > 解决方案 > 无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

问题描述

Xcode 10.2,斯威夫特 5。

我在文件UICollectionViewCell中定义了一个。.xib我将它加载到我的UIViewController(不是UICollectionViewController)子类中并将其返回到cellForItemAt.

在我的UICollectionViewCell(称为TagCell)中,我这样做:

    override
    func
    awakeFromNib()
    {
        super.awakeFromNib()

        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        self.translatesAutoresizingMaskIntoConstraints = false

        self.layer.borderColor = UIColor(red: 0.354, green: 0.442, blue: 0.297, alpha: 0.74).cgColor
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 4.0
    }

Nib 只有我放入的顶层UICollectionViewCell,并且UILabel所有四个边缘都具有固定的 4 像素约束。UILabel我设置了in的文本cellForItemAt。但是,生成的集合以我设置的估计高度的所有单元格呈现viewDidLoad()

    override
    func
    viewDidLoad()
    {
        super.viewDidLoad()

        let nib = UINib(nibName: "TagCell", bundle: Bundle(for: type(of: self)))
        self.collectionView.register(nib, forCellWithReuseIdentifier: "TagCell")

        let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.estimatedItemSize = CGSize(width: 60.0, height: 25.0)
}

细胞笔尖文件:

细胞笔尖截图

这似乎是我在网上找到的 Apple 和其他资源告诉我要做的任何事情,但我一定错过了一些重要的事情。我还尝试在我的 UILabel 上将水平压缩阻力优先级设置为 1000,但它们一直被截断。

我也尝试过设置>=宽度限制,但这似乎被忽略了。

在我设置之前self.contentView.translatesAutoresizingMaskIntoConstraints,我会在调试器中收到冲突约束警告。但是现在它并没有抱怨>=宽度限制,甚至认为它违反了它。

标签: iosswiftuicollectionviewconstraints

解决方案


因此,事实证明您必须在单元格中执行以下操作awakeFromNib()

        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        let fixupConsts =
        [
            self.contentView.leftAnchor.constraint(equalTo: self.leftAnchor),
            self.contentView.rightAnchor.constraint(equalTo: self.rightAnchor),
            self.contentView.topAnchor.constraint(equalTo: self.topAnchor),
            self.contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor)
        ]
        NSLayoutConstraint.activate(fixupConsts)

尽管WWDC 2014 Session 226非常明确地指出您唯一需要做的就是将其设置estimatedCellSize为非零值,但这还不够。

如果有人可以提供更好的答案,我很乐意将其标记为答案。


推荐阅读