如何调整 UICollectionView 单元格的大小以适合其中的内容?

Posted

技术标签:

【中文标题】如何调整 UICollectionView 单元格的大小以适合其中的内容?【英文标题】:How to size a UICollectionView cell to fit the contents inside it? 【发布时间】:2017-01-08 20:06:24 【问题描述】:

我正在考虑在sizeForItemAt 中执行此操作,但我无法访问那里的单元格内容的高度。尝试在cellForItemAt 中执行此操作,因为我们正在那里创建单元格的实例,并且可以在那里引用它的所有内容及其高度,但是在此方法中设置单元格的帧大小似乎不起作用。似乎只能在sizeForItemAt 中正确设置大小。这是我尝试在cellForItemAt 中执行此操作的示例(请注意,在此方法中,我添加了likesCommentsLabel 视图,具体取决于它是否具有为其.text 分配的字符串,这就是使高度动态的原因):

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let feedCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! FeedCell

    feedCell.post = posts[indexPath.item] //This executes post setter and didSet in FeedCell class

    //Determine whether to add likesCommentsLabel
    if (feedCell.likesCommentsLabel.text != nil) 
        feedCell.addSubview(feedCell.likesCommentsLabel)
        feedCell.addConstraintsWithFormat(format: "H:|-12-[v0]|", views: feedCell.likesCommentsLabel)
        feedCell.addConstraintsWithFormat(format: "V:|-8-[v0(44)]-4-[v1]-4-[v2(200)]-8-[v3(24)]-8-[v4(0.4)][v5(44)]|", views: feedCell.profileImageView, feedCell.statusTextView, feedCell.statusImageView, feedCell.likesCommentsLabel, feedCell.dividerLineView, feedCell.credibilityButton)

        print("THIS RUNS")
    
    else 
        feedCell.addConstraintsWithFormat(format: "V:|-8-[v0(44)]-4-[v1]-4-[v2(200)]-8-[v3(0.4)][v4(44)]|", views: feedCell.profileImageView, feedCell.statusTextView, feedCell.statusImageView, feedCell.dividerLineView, feedCell.credibilityButton)
        print("THIS RUNS MORE")
    

    //Determine size of cell based on status text  length
    if let statusText = posts[indexPath.item].statusText 
        let rect = NSString(string: statusText).boundingRect(with: CGSize(width: view.frame.width, height: 500), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 14)], context: nil)

        var knownHeight: CGFloat = 8.0 + 44.0 + 4.0 + 4.0 + 200.0 + 8.0 + 44.0

        //Add to height of cell, if there's a likes/comments label
        if (feedCell.likesCommentsLabel.text != nil) 
            knownHeight = CGFloat(8.0 + 44.0 + 4.0 + 4.0 + 200.0 + 8.0 + 24.0 + 8.0 + 44.0)
        
        else 
            knownHeight = CGFloat(8.0 + 44.0 + 4.0 + 4.0 + 200.0 + 8.0 + 44.0)
        
        //Calculate y position based off of previous cell. If no previous cell, y = 0.
        if indexPath.item > 0 
            feedCell.frame = CGRect(x: 0, y: ((collectionView.cellForItem(at: collectionView.indexPathsForVisibleItems[indexPath.item - 1])?.frame.origin.y)! +  (collectionView.cellForItem(at: collectionView.indexPathsForVisibleItems[indexPath.item - 1])?.frame.height)!), width: view.frame.width, height: rect.height + knownHeight + 20)
        
        else 
            feedCell.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: rect.height + knownHeight + 20)
        
        print(feedCell.frame)
    

    return feedCell

【问题讨论】:

这实际上可能对您有所帮助:corsarus.com/2015/collection-view-with-self-sizing-cells 【参考方案1】:

覆盖 'viewDidLayoutSubviews' 方法并使您的 collectionview 的布局无效,例如,

 - (void)viewDidLayoutSubviews 
     [super viewDidLayoutSubviews];
  [yourCollectionView.collectionViewLayout invalidateLayout];
 

然后 'sizeForItemAtIndexPath' 将起作用!

【讨论】:

以上是关于如何调整 UICollectionView 单元格的大小以适合其中的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据里面的 UILabel 子视图调整 UICollectionView 中的单元格大小

如何调整 UICollectionView 单元格的大小以适合其中的内容?

UITableViewCell内的UICollectionView如何根据屏幕大小调整tableview单元格高度

如何在 UICollectionView Swift 4.0 中正确调整大小和居中扩展单元格

在不使用 reload 方法的情况下调整 UICollectionView 的单元格

如何在UICollectionView Swift 4.0中正确调整和扩展单元格的大小和居中