iOS - 带有内容插入的粘性标题 - 标题视图不像单元格那样滚动

Posted

技术标签:

【中文标题】iOS - 带有内容插入的粘性标题 - 标题视图不像单元格那样滚动【英文标题】:iOS - Sticky headers with content inset - Header view is not scrolling like the cell 【发布时间】:2019-03-03 00:52:40 【问题描述】:

我们尝试将UICollectionView 像列表一样滚动到地图上。不要将这与卡在一个点(如低、中和高)的底部工作表相混淆。集合视图的 flowlayout 属性启用了sectionHeadersPinToVisibleBounds。我附上了示例项目供您参考。当用户滚动时,标题视图是否可以移动到集合视图的顶部?

Here是示例项目

我需要进行基本的更改才能进入该状态:

let layout = UICollectionViewFlowLayout()
layout.sectionHeadersPinToVisibleBounds = true
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 0

let collectionView = UICollectionView(frame: .zero,
                                              collectionViewLayout: layout)


override func viewWillLayoutSubviews() 
  super.viewWillLayoutSubviews()

  collectionView.contentInset = UIEdgeInsets(top: drawerHeight, left: 0, bottom: 0, right: 0)

这是您将看到的屏幕截图:

红色视图是固定的标题视图。我是否需要自定义布局来在用户滚动时更新其位置?

【问题讨论】:

【参考方案1】:

我从post 获得灵感,编写了一个自定义的 StickyHeaderLayout。这是我的错误的修复:

class StickyHeaderLayout: UICollectionViewFlowLayout 

    override init() 
        super.init()
        configureLayout()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        configureLayout()
    

    private func configureLayout() 
        self.sectionFootersPinToVisibleBounds = true
        self.sectionHeadersPinToVisibleBounds = true
        minimumLineSpacing = 0
        minimumInteritemSpacing = 0
    

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? 
        guard let attributes = super.layoutAttributesForElements(in: rect) else  return nil 

        for attribute in attributes 
            adjustAttributesIfNeeded(attribute)
        
        return attributes
    

    override func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? 
        guard let attributes = super.layoutAttributesForSupplementaryView(ofKind: elementKind, at: indexPath) else  return nil 
        adjustAttributesIfNeeded(attributes)
        return attributes
    

    func adjustAttributesIfNeeded(_ attributes: UICollectionViewLayoutAttributes) 
        switch attributes.representedElementKind 
        case UICollectionView.elementKindSectionHeader?:
            adjustHeaderAttributesIfNeeded(attributes)
        default:
            break
        
    

    private func adjustHeaderAttributesIfNeeded(_ attributes: UICollectionViewLayoutAttributes) 
        guard let collectionView = collectionView else  return 
        guard attributes.indexPath.section == 0 else  return 

        if collectionView.contentOffset.y <= 0 
            attributes.frame.origin.y = 0
         else 
            attributes.frame.origin.y = collectionView.contentOffset.y
        
    

【讨论】:

正是我需要的。【参考方案2】:

一个部分是工作,但如果你有超过一个部分,它会引起一些问题

【讨论】:

以上是关于iOS - 带有内容插入的粘性标题 - 标题视图不像单元格那样滚动的主要内容,如果未能解决你的问题,请参考以下文章

带有侧导航和内容区域的 CSS3/HTML5 粘性页眉/页脚

设置粘性页眉和项目布局 Recyclerview

菜单和内容 div 向左浮动并带有粘性页脚 -> 高度 100%

使用带有两行的粘性页脚创建响应式 Bootstrap 样式

由于下面的内容,粘性导航栏停止工作[重复]

使用带有引导程序的 flexbox 粘性页脚