自动布局的UICollectionView自尺寸单元

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我试图让UICollectionViewCells使用自动布局,但我似乎无法让单元格按照内容进行调整。我很难理解单元格的大小是如何从单元格的内容中更新的。

下面是我尝试过的设置:

  • 自定义的UICollectionViewCell,其内容视图中有一个UITextView。
  • 禁用UITextView的滚动。
  • ContentView的水平约束是:“H:_TextView(320)“,即将UITextView固定在单元格左侧,显式宽度为320。
  • ContentView的垂直约束是:“V:-0-_TextView“,即将UITextView固定在单元格顶部。
  • UITextView有一个高度约束设置为一个常量,UITextView报告将其与文本相匹配。

如下所示,单元格背景设置为红色,UITextView背景设置为Blue:

提问于
用户回答回答于

为IOS 9更新

在看到我的GitHub解决方案在iOS 9下崩溃后,我终于有时间对这个问题进行充分的调查。我现在已经更新了回购,以包括几个不同的配置,为自我大小单元。我的结论是,自我大小的细胞在理论上是伟大的,但在实践中是混乱的。在进行自定大小单元格时,请注意。

TL;DR

自调整单元格只支持流布局,所以请确保这是正在使用的。

要使自调整单元格工作,需要设置两件事。

1.集estimatedItemSizeUICollectionViewFlowLayout

一旦设置了estimatedItemSize财产。

self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)

2.在单元格子类上添加对大小调整的支持

这有两种口味:自动布局自定义覆盖preferredLayoutAttributesFittingAttributes.

使用自动布局创建和配置单元格

需要确保在单元格的内容视图上设置自动调整大小掩码,并且在加载单元格时,将内容视图的边界设置为单元格的边界(即awakeFromNib)

需要注意的是,单元格需要比表视图单元格受到更严重的约束。例如,如果希望您的宽度是动态的,那么单元格需要一个高度约束。同样,如果希望高度是动态的,则需要对单元格设置宽度约束。

实施preferredLayoutAttributesFittingAttributes在自定义单元格中

调用此函数时,视图已经配置了内容(即cellForItem已经打电话了)。假设约束已经适当设置,那么可以有如下实现:

//forces the system to do one layout pass
var isHeightCalculated: Bool = false

override func preferredLayoutAttributesFittingAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    //Exhibit A - We need to cache our calculation to prevent a crash.
    if !isHeightCalculated {
        setNeedsLayout()
        layoutIfNeeded()
        let size = contentView.systemLayoutSizeFittingSize(layoutAttributes.size)
        var newFrame = layoutAttributes.frame
        newFrame.size.width = CGFloat(ceilf(Float(size.width)))
        layoutAttributes.frame = newFrame
        isHeightCalculated = true
    }
    return layoutAttributes
}

preferredLayoutAttributesFittingAttributes需要确保只更改布局属性的框架一次。如果不这样做,布局将无限期地调用实现,并最终崩溃。一种解决方案是在单元格中缓存计算出的大小,并在任何时候重复使用单元格或更改其内容,就像我对isHeightCalculated财产。

体验你的布局

此时,应该在集合视图中具有“功能”动态单元格。在我的测试中,我还没有找到现成的解决方案,所以如果有,请随时评论。我还是觉得UITableView赢得动态尺寸IMHO的战斗。

用户回答回答于

在步骤1中,当使用自动布局时,只需向单元格中添加一个单亲UIView即可。单元格内的所有内容都必须是父单元格的子视图。回答了我所有的问题。虽然XCode会自动为UITableViewCells添加这个功能,但是它不会(但应该)添加到UICollectionViewCells。:

若要配置单元格的外观,请将将数据项的内容表示为子视图所需的视图添加到contentView属性中的视图中。不要直接向单元格本身添加子视图。

扫码关注云+社区