[英]CollectionView jumps on reloadData
我正在尝试为我的UICollectionView
实现干净的分页功能。 但是当我将单元格添加到我的 UICollectionView 时,collectionView 奇怪地向下跳了几个像素。
我确实使用UICollectionViewDelegateFlowLayout
的UICollectionViewCell
、 UICollectionViewCell
的preferredLayoutAttributesFitting
和AutoLayout
sizeForItem
我已经尝试了 preferredLayoutAttributesFitting 的不同实现,并且在观察了 collectionView 的偏移值之后,我可以看出偏移量正在改变,并且不负责该行为。
当我使用RxSwift
和RxCocoa
时,我不会自己调用 reloadData() 。
一些代码:
UICollectionView - setup code
let collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.minimumLineSpacing = 16
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
layout.sectionInsetReference = .fromContentInset
layout.sectionInset = UIEdgeInsets.init(top: 0, left: 16, bottom: 0, right: 16)
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.register(SomeCell.self, forCellWithReuseIdentifier: "someCell")
collectionView.backgroundColor = .clear
collectionView.scrollIndicatorInsets = UIEdgeInsets.init(top: 76, left: 0, bottom: 0, right: 0)
collectionView.contentInset = UIEdgeInsets.init(top: 76 + 16, left: 0, bottom: 16, right: 0)
collectionView.refreshControl = UIRefreshControl()
return collectionView
}()
UICollectionViewDelegateFlowLayout - sizeForItem
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let sectionInset = (collectionViewLayout as! UICollectionViewFlowLayout).sectionInset
let referenceHeight: CGFloat = 350
let referenceWidth = collectionView.safeAreaLayoutGuide.layoutFrame.width
- sectionInset.left
- sectionInset.right
- collectionView.contentInset.left
- collectionView.contentInset.right
return CGSize(width: referenceWidth, height: referenceHeight)
}
UICollectionViewCell - preferredLayoutAttributes
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
titleLabel.preferredMaxLayoutWidth = layoutAttributes.size.width - contentView.layoutMargins.left - contentView.layoutMargins.left
someLabel.preferredMaxLayoutWidth = layoutAttributes.size.width - contentView.layoutMargins.left - contentView.layoutMargins.left
layoutAttributes.bounds.size.height = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
return layoutAttributes
}
如果您想查看更具体的代码,请随时询问!
根据我在通过集合视图进行分页时的经验,当我的单元格不是屏幕的完整宽度或高度(分别取决于水平或垂直分页)时,往往会出现问题。 在视频中,您的单元格可能不完全适合屏幕尺寸,因为您的参考高度仅为 350。如果是这种情况,那么您需要考虑单元格的正确插入和行距,以便分页与您的对齐内容。
这些是我发现在帮助解决此问题方面必不可少的方法(这些值假设单元格在分页方向上占据屏幕的整个大小):
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0.0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsetsMake(0, 0, 0, 0)
}
如果您的单元格没有填满屏幕,请相应地调整这些值,以使您的单元格不会在屏幕上/下半途结束。
如果这没有帮助,那么我认为这可能与您添加单元格的方式有关,但根据您发布的代码,我看不出这是如何发生的。 希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.