滚动时 Uicollectionview 不更新标题

Posted

技术标签:

【中文标题】滚动时 Uicollectionview 不更新标题【英文标题】:Uicollectionview is not updating header when scrolling 【发布时间】:2017-07-19 07:56:52 【问题描述】:

CollectionView 具有标题和自定义布局。 当我单击单元格时,有两种方法正在工作。 1)didSelectItemAt 2) viewforsupplementaryelementofkind 我单击单元格并滚动到页面的开头。 无法动态检测 header 中的 detailPhotoStory 大小。

var headerHeight: CGFloat = 0.0
var headerView: DetailCollectionReusableView?

//viewForSupplementaryElementOfKind

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String,at indexPath: IndexPath) ->UICollectionReusableView 
        if kind == UICollectionElementKindSectionHeader
        

            headerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader,
                                                                         withReuseIdentifier: "detailCollectionReusableView",
                                                                         for: indexPath) as? DetailCollectionReusableView

            headerView?.detailPhotoStory.text = PhotoItemArraySelected[indexPath.row].photoStory

            headerView?.setNeedsLayout()
            headerView?.layoutIfNeeded()
            headerHeight = 380
            headerHeight += (headerView?.detailPhotoStory.frame.height)!

            return headerView!
        

        return UICollectionReusableView()
    

//didSelectItemAt

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

        headerView?.detailPhotoStory.text = PhotoItemArraySelected[0].photoStory
        headerView?.setNeedsLayout()
        headerView?.layoutIfNeeded()

        headerHeight = 380
        headerHeight += (headerView?.detailPhotoStory.frame.height)!

        collectionView.reloadData()
        collectionView.scrollToItem(at: IndexPath(row: 0, section: 0),
                                    at: .top,
                                    animated: true)
    

【问题讨论】:

请更具体地说明您要询问的内容。您指的是哪种标签尺寸? 使用这个referenceSizeForHeaderInSection,从你的内容中获取高度并返回你的高度 @karthikeyan 我使用了referenceSizeForHeaderInSection,但collectionview的标题没有改变。 【参考方案1】:

您可以像这样创建字符串扩展,并使用它根据宽度和使用的字体获取标签高度。您可以使用返回的高度来分配单元格的高度。

extension String 
     func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat 
         let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
         let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

         return boundingBox.height
  

来源是this ans。

【讨论】:

以上是关于滚动时 Uicollectionview 不更新标题的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionview 更新回调

滚动 UICollectionView 不断更新值

UICollectionView - 基于水平滚动更新数组 indexPath

向上滚动时保持 UICollectionView 中的滚动位置

UICollectionView indexPathsForVisibleItems 不更新新的可见单元格

UICollectionView 不自动滚动