动态 UICollectionView 单元格框架

Posted

技术标签:

【中文标题】动态 UICollectionView 单元格框架【英文标题】:Dynamic UICollectionView Cell Frame 【发布时间】:2018-07-27 04:04:38 【问题描述】:

现在,我遇到了一个问题。

我设法将单元格的内容视图包装到它的标签上,但是有些间距不适合设计。单元格之间有一些可用空间

这是我的代码

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
    return 4


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 

    let hastag = Hastag.fetchHastag()[indexPath.row]

    let approximateWidth = view.frame.width - 20
    let size = CGSize(width: approximateWidth, height: 28)
    let attribute = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)]

    let estimatedFrame = NSString(string: hastag.hastag).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attribute, context: nil)

    return CGSize(width: estimatedFrame.width + 20, height: 26)


下面是结果

这就是我想要实现的,它会是这样的

更新

这是我收集视图数据源和委托的完整代码。 Hastag.hastag 是字符串类型

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return Hastag.fetchHastag().count


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "hastagCell", for: indexPath) as! HastagCollectionViewCell

    cell.hastag = Hastag.fetchHastag()[indexPath.row]

    return cell


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
    return 4


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 

    let hastag = Hastag.fetchHastag()[indexPath.row]

    let approximateWidth = view.frame.width - 20
    let size = CGSize(width: approximateWidth, height: 28)
    let attribute = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)]

    let estimatedFrame = NSString(string: hastag.hastag).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attribute, context: nil)

    return CGSize(width: estimatedFrame.width + 16, height: 26)


【问题讨论】:

使用自定义布局'UICollectionViewLeftAlignedLayout'就可以了 你的意思是我必须使用图书馆? @Anuraj 是的..我用过这个 有什么想法可以让我在不使用库的情况下实现它吗? @Anuraj @Anuraj 谢谢老兄,我终于使用了你推荐的(TagListView)库 【参考方案1】:

您可以使用AlignedCollectionViewFlowLayout,它不是一个库,只有一个文件。只需将此文件添加到您的项目中,然后从您的UICollectionView xib 中将流布局设置为AlignedCollectionViewFlowLayout。这是非常容易使用。请检查以下链接。

https://github.com/mischa-hildebrand/AlignedCollectionViewFlowLayout

【讨论】:

我试过放文件,但错误太多。你能告诉我怎么做吗? 你在使用 xib 吗?您是手动创建collectionview 还是在XIB 中创建? 检查链接是否有“Setup in Interface Builder”,“Setup in code”,如果你不明白什么就问。 我正在我的故事板中创建集合视图单元格。错误来自我第一次放置文件。我的代码没有错误,但是文件(AlignedCollectionViewFlowLayout.swift)本身有很多错误 你使用的是 Swift 3 还是 4?【参考方案2】:

您可以使用NSStringsize(withAttributes:) 函数为您提供具有特定字体和大小的字符串的CGSize

假设Hastag.hastagString 我认为以下应该可行:

extension YourViewController: UICollectionViewDelegateFlowLayout 
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        let hastag = Hastag.fetchHastag()[indexPath.row]
        let title = hastag.hastag as NSString
        let titleSize = title.size(withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)])
        return CGSize(width: titleSize.width + 20, height: 26)
    

注意您的ViewController 必须实现UICollectionViewDelegateFlowLayout 协议,并且您必须将ViewController 设置为delegate 才能使UICollectionView 起作用。

希望对您有所帮助。

【讨论】:

感谢您的回答,但您的代码返回的代码与我的代码相同 hmm...那么您的设置中一定有其他不同的东西...因为上述工作对我有用 :) 您能告诉我您是如何定义布局的吗? 请检查我的更新;)。在情节提要上,我为我的集合视图 8、8、16、16(顶部、底部、尾随、前导)设置了约束,以防您需要知道 @Jason 我已经更新了我的答案,确保你实现了UICollectionViewDelegateFlowLayout 并将你的视图控制器添加为delegate(参见这个很好的答案,例如:***.com/a/12925529/4063602)跨度> 好的。并且你可以看到如果你在其中放置一个断点,你的方法被调用了?【参考方案3】:

经过几次尝试,我终于放弃了自定义单元格大小,而是使用库TagListView

【讨论】:

以上是关于动态 UICollectionView 单元格框架的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView:使用 UIStackView 的动态单元格高度

动态修复屏幕中的 UICollectionView 单元格

纵向和横向的 uicollectionview 单元格框架

根据单元格的不更改单元格高度动态更改 UICollectionView 高度

UICollectionView 动态单元格高度(Pinterest 布局)

如何向 UICollectionView 动态添加新单元格?