UICollectionView 最初滚动跳跃

Posted

技术标签:

【中文标题】UICollectionView 最初滚动跳跃【英文标题】:UICollectionView Scroll Jumpy Initially 【发布时间】:2021-03-06 17:06:34 【问题描述】:

我正在使用 UICollectionView 进行聊天并在加载时使用滚动到底部。一切都很好,除了我第一次手动滚动它反弹了大约 50-100 pt。如果我继续滚动,它会进入安全区域并位于屏幕下方。

是什么导致了初始反弹?似乎它首先从底部安全区域的顶部反弹,如果您继续滚动,它会很好地低于安全区域。

我想要得到的是一个很好的平滑滚动,最初没有奇怪的反弹。

这似乎是由于我在使用invalidateLayout 加载图像高度后动态调整图像高度。

【问题讨论】:

【参考方案1】:

我能够通过以下运气解决这个问题

AutoSizing cells: cell width equal to the CollectionView

// UICollectionViewController

if let layout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout 
    layout.estimatedItemSize = CGSize(width: view.frame.width, height: 100)

        
// UICollectionViewCell

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes 
    let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
    
    // Specify you want _full width_
    let targetSize = CGSize(width: layoutAttributes.frame.width, height: 200)
    
    // Calculate the size (height) using Auto Layout
    let autoLayoutSize = contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: UILayoutPriority.required, verticalFittingPriority: UILayoutPriority.defaultLow)
    let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize)
    
    // Assign the new size to the layout attributes
    autoLayoutAttributes.frame = autoLayoutFrame
    return autoLayoutAttributes

【讨论】:

以上是关于UICollectionView 最初滚动跳跃的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionView 滚动了一定距离后调用函数 Objective-C

快速滚动后在 UICollectionView 中保留按钮内容

iOS 7 中 UICollectionView 中不需要的垂直滚动

在滚动期间点击时,UICollectionView 不再识别单元格上的点击?

UICollectionView(I)

使 UICollectionView 始终以项目为中心停止滚动