Строка прокрутки неправильно отображается под заголовком раздела UICollectionView

По какой-то причине моя полоса прокрутки всегда появляется под заголовком секции просмотра коллекции. Любая помощь очень ценится!

введите описание изображения здесь

Ответ 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. Надеюсь, это работает достаточно хорошо, пока ошибка не будет исправлена.

Ответ 2

Такая же концепция, но вот более простое обходное решение, которое не требует, чтобы ваши экземпляры UICollectionReusableView использовали подкласс.

Соответствует UICollectionViewDelegate (если вы этого еще не сделали) и реализуете метод protocolDisplaySupplementaryView так:

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

Протестировано в iOS 11.2.1.

Ответ 3

Вот моя альтернатива, которая, похоже, работает лучше на iOS12 при подклассификации UICollectionReusableView.

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
    }
}