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

时间:2017-10-11 17:21:44

标签: swift uicollectionview uicollectionviewcell

由于某些原因,我的滚动条始终显示在集合视图部分标题下方。任何帮助是极大的赞赏!

enter image description here

4 个答案:

答案 0 :(得分:25)

我找到了解决方法。此问题是标题视图的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中没有出现此问题。希望这个问题能够很好地解决,直到修复错误。

答案 1 :(得分:16)

相同的概念,但这里有一个更简单的解决方法,不需要您的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中测试。

答案 2 :(得分:1)

使用长滚动,异步加载集合,此替代方案可能会提供稍好的性能。

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

答案 3 :(得分:0)

这是我的替代方法,当继承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
    }
}