繁体   English   中英

CollectionView 在 reloadData 上跳转

[英]CollectionView jumps on reloadData

我正在尝试为我的UICollectionView实现干净的分页功能。 但是当我将单元格添加到我的 UICollectionView 时,collectionView 奇怪地向下跳了几个像素。

例子

我确实使用UICollectionViewDelegateFlowLayoutUICollectionViewCellUICollectionViewCellpreferredLayoutAttributesFittingAutoLayout sizeForItem

我已经尝试了 preferredLayoutAttributesFitting 的不同实现,并且在观察了 collectionView 的偏移值之后,我可以看出偏移量正在改变,并且不负责该行为。

当我使用RxSwiftRxCocoa时,我不会自己调用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM