По какой-то причине моя полоса прокрутки всегда появляется под заголовком секции просмотра коллекции. Любая помощь очень ценится!
Строка прокрутки неправильно отображается под заголовком раздела 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
}
}