滚动条错误地出现在 UICollectionView 部分标题下方

Posted

技术标签:

【中文标题】滚动条错误地出现在 UICollectionView 部分标题下方【英文标题】:Scrollbar incorrectly appears underneath UICollectionView section header 【发布时间】:2017-10-11 17:21:43 【问题描述】:

出于某种原因,我的滚动条总是出现在集合视图部分标题下方。任何帮助是极大的赞赏!

【问题讨论】:

这是一个 ios 11 错误。滚动条在 iOS 10 中的位置正确。 【参考方案1】:

我找到了解决方法。这个问题是集合视图错误地设置了标题视图的zPosition。为了解决这个问题,我们将始终确保 zPosition 是我们想要的值。

创建一个 CALayer 子类,以防止 zPosition 为 0 以外的任何值。

class CustomLayer: CALayer 
    override var zPosition: CGFloat 
        get  return 0 
        set 
    

然后将您的集合视图标题的图层类设置为这个新的子类。

class MyHeaderView: UICollectionReusableView 

    // your other custom code here

    override class var layerClass: AnyClass 
        get  return CustomLayer.self 
    


这是 iOS 11 的一个错误,因为这个问题在 iOS 10 中不会发生。希望在修复错误之前它可以正常工作。

【讨论】:

感谢分享,这似乎是比我正在做的更好的解决方案。我基本上只是将 headerCell 设置为常规单元格。但你的看起来更干净。 很好的修复!感谢分享:) 很遗憾这仍然是 iOS 12 中的一个问题【参考方案2】:

相同的概念,但这里有一个更简单的解决方法,不需要您的 UICollectionReusableView 实例使用子类。

遵循UICollectionViewDelegate(如果你还没有的话)并像这样实现willDisplaySupplementaryView协议方法:

func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) view.layer.zPosition = 0.0

在 iOS 11.2.1 中测试。

【讨论】:

@Nathan 这个 bug 只存在于 iOS 11,所以这段代码对 iOS 【参考方案3】:

这是我的替代方案,当子类化 UICollectionReusableView 时,它似乎在 iOS12 上效果更好。

final class BasicCollectionSectionHeader: UICollectionReusableView 
    override var layer: CALayer 
        let layer = super.layer
        layer.zPosition = 0 // make the header appear below the collection view scroll bar
        return layer
    

【讨论】:

【参考方案4】:

对于长滚动、异步加载的集合,这种替代方案可能会提供更好的性能。

class MyHeaderView: UICollectionReusableView 
    override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) 
        layer.zPosition = 0
    

【讨论】:

以上是关于滚动条错误地出现在 UICollectionView 部分标题下方的主要内容,如果未能解决你的问题,请参考以下文章

如何让div滚动时页面不跟着滚动?

Three.js 全屏问题

浏览器页面出现横向滚动条

jquery.nicescroll页面初始化无滚动条,等到撑开到应该出现滚动条的时候还是不出现,纠结了,请大神

css如何在页面内出现滚动条的地方禁止鼠标滑轮滚动

如何使用滚动条可靠地获取屏幕宽度