使用 swift 自动调整大小的集合视图单元格不起作用

Posted

技术标签:

【中文标题】使用 swift 自动调整大小的集合视图单元格不起作用【英文标题】:self-sizing collection view cells using swift not working 【发布时间】:2015-09-02 01:56:52 【问题描述】:

我正在尝试创建一个包含可以自动调整大小的单元格的集合视图。以前我使用过 sizeForItemAtIndexPath 但无法为带有属性字符串的 textView 获得完全正确的单元格高度。我决定放弃这种方法并使用自动调整大小功能。我在这里找到了一些信息,但主要是objective-C。我只熟悉斯威夫特。即便如此,我已经选择了它,但它仍然无法正常工作。

到目前为止,我所做的是在我的 viewDidLoad 中包含以下代码:

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout 
    flowLayout.estimatedItemSize = CGSize(
        width: self.view.frame.size.width, height: 100)

单元格宽度显示正确,但无论内容如何,​​所有单元格高度都停留在 100。

我还需要做些什么来启用自动调整大小吗?我很确定我的故事板约束设置正确。

【问题讨论】:

嗨。谢谢你的评论。在 ios8 collectionView 和 TableViews 中,使用自动调整大小来根据约束和内容正确调整单元格的大小。我只是不确定如何在 collectionView 中正确实现这一点。我已经在 tableView 中完成了。有几篇文章是在 collectionView 中完成的,但代码是在 Objective-C 中。我相信我可能需要在单元子类中实现一个方法,但不知道该怎么做。无论如何,这是我的理解。如果我错了,我会回到 sizeForItemAtIndexPath 并尝试计算出属性字符串 textView 高度 对不起,我应该提到单元格正在动态调整大小 【参考方案1】:

除了设置estimatedItemSize,您还应该确保通过委托或数据源方法提供项目大小。 self-sizing 机制的要点是 UIKit 将使用估计的项目大小作为其初始估计,然后根据您在单元格的 contentView 上配置的 Auto Layout 约束计算确切的高度。另外,您需要 iOS 8 或更高版本的 Base SDK。

这个 repo reproduces Apple's example 来自 WWDC 会议,他们在其中引入了自调整大小的单元格。

【讨论】:

嗨。这看起来很有希望,但 flowLayout.itemSize = UIViewAutomaticDimension 无法识别。我输入正确吗?我只看到 AutoResizing 但那不是 CGSize 对不起,我的错误。我在考虑表格视图,其中有一个 UITableViewAutomaticDimension。对于 UICollectionView,您根本不设置 itemSize。这个 repo 展示了一个工作示例:github.com/algal/SelfSizingCellsDemo 我下载了这个项目,但我真的看不出我哪里出了问题。我尝试了几件事,但高度始终保持不变。我想我会回到 sizeForItemAtIndexPath。感谢您的帮助。【参考方案2】:

一种解决方法可能是根据屏幕大小调整 collectionView 单元格的高度和宽度:

   func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

        let deviceSize = UIScreen.mainScreen().bounds.size
        //let cellSize = sqrt(Double(deviceSize.width * deviceSize.height) / (Double(33)))

        let cellWidth = ((deviceSize.width / 2) - 10)
        let cellHeight = (deviceSize.height / 4)

        return CGSize(width: cellWidth , height: cellHeight)
    

【讨论】:

以上是关于使用 swift 自动调整大小的集合视图单元格不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥集合视图中的动态集合单元格不显示为给定大小并且在 swift 3 中滚动后会发生变化

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

具有三个 UILabel 的自我调整大小的单元格不起作用

自动调整嵌入在 UITableView 中的 UICollectionView 单元格不起作用

UITableView 单元格不使用标签文本自动调整大小

如何根据带有自动调整大小的传入数据在集合视图单元格中添加随机内容(UIKit 元素)?