回调sectionHeadersPinToVisibleBounds

时间:2017-05-15 19:22:50

标签: ios uicollectionview uicollectionviewlayout uicollectionreusableview

我的项目中有一个要求,当它们变粘时,我必须向UICollectionView标头添加阴影。

我在UICollectionViewFlowLayout sectionHeadersPinToVisibleBounds上使用该属性,当设置为YES时,标题会变粘。

我的问题是 - 当标题变得粘滞并实际固定到顶部时,我们可以获得某种回调,以便我可以为该标题添加阴影。当标题不粘时,我不希望阴影存在。

这里的挑战是,我无法真正利用method- layoutAttributesForSupplementaryView中的信息:它确实为我提供了屏幕上的视图,因为我的部分具有动态的项目,因此哪个部分在屏幕上并不真正告诉我谁需要一个影子。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我设法通过以下方式找到了这个问题的解决方案:

  1. 手动保存标题的位置:

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    let cell = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CategoryNameReusableView", for: indexPath) as! CategoryNameReusableView
                cell.nameLbl.text = sectionNames[indexPath.section]
                if viewWithPosition.isEmpty { viewWithPosition.append(( name: cell.nameLbl.text!, position: cell.frame.origin.y))}
                let x = isElementInArray(array: viewWithPosition, string: cell.nameLbl.text!)
                if !x {
                    viewWithPosition.append((name: cell.nameLbl.text!, position: cell.frame.origin.y))
                }
            return cell
    }
    
  2. 我正在使用viewWithPosition元组var viewWithPosition = [(name: String, position: CGFloat)]()的数组。如果我只保存一个单元格的位置,它可能是相同的,但由于我的单元格有不同的文本,我使用name参数来检查该元素是否已存在于数组中。我使用了辅助函数:

    fileprivate func isElementInArray(array: [ViewAndPosition], string: String) -> Bool {
        var bool = false
        for views in array {
            if views.name == string {
                bool = true
                return bool
            }
        }
        return bool
    }
    
    1. 当我有初始位置时,我会检查可见的标题是否放错位置:

      func scrollViewDidScroll(_ scrollView: UIScrollView) {
      if let visibleHeadersInSection = collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader) as? [CategoryNameReusableView] {
          for header in visibleHeadersInSection{
              if let index = viewWithPosition.index(where: { (element) -> Bool in
                  element.name == header.nameLbl.text
              }){
                  if header.frame.origin.y == viewWithPosition[index].position {
                      header.backgroundColor = UIColor.clear
                  } else {
                      header.backgroundColor = UIColor.white
                  }
              }
          }
      }
      

      }

    2. 目前似乎Apple没有针对这种情况提供回调。希望这也是您的解决方案。