2

使用此处解释的解决方案时,我在 iOS 12 中遇到了一个奇怪的问题。

首次加载集合视图时效果很好,但是当我尝试使用collectionView.reloadData()或重新加载集合视图时collectionView.collectionViewLayout.invalidateLayout(),会添加一个奇怪的单元格高度。

一旦我开始滚动,一切都会再次正常。请看下面的图片。第一张图片显示了视图加载后单元格的工作高度。第二个显示按下重新加载后的单元格。

在第一次加载时效果很好

单击重新加载栏按钮后

重新加载栏按钮调用以下方法。

@objc func reloadCollectionView() {
        collectionView.collectionViewLayout.invalidateLayout()
}

请在此处查看 GitHub 中的示例项目以重现该问题。我使用 Xcode 10.1 和 10.2 重现了这个问题。

任何解决问题的帮助或指导将不胜感激!

提前致谢。

4

2 回答 2

2

我认为这个问题来自你打电话:

flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

在你的项目中。

如果您将其重置为:

layoutFlow.estimatedItemSize = CGSize(width: UIScreen.main.bounds.size.width, height: 100)

然后它立即运行更顺畅。

注意:值得注意的是,您设置单元格的估计高度很重要。如果将其设置为 0,reloadData()则将 collectionView 滚动到顶部。设置一个准确的值似乎在测试中效果最好

仍然有一些错误似乎可以通过删除

collectionView.collectionViewLayout.invalidateLayout()

并将其换成类似的东西

collectionView.reloadData()
collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)

我不知道你想要这个的具体用途,所以我无法完全测试它应该是怎样的,但 invalidateLayout 似乎是重新加载 collectionView 的错误方法。

于 2019-05-21T01:47:44.873 回答
0

在 iOS 12 中,contentView 通过 itemsSize 默认(50x50)获得约束。手动设置边缘约束以获得正确的调整大小

override func awakeFromNib() {
    super.awakeFromNib()
    
    NSLayoutConstraint.activate([
        contentView.topAnchor.constraint(equalTo: topAnchor),
        contentView.leadingAnchor.constraint(equalTo: leadingAnchor),
        contentView.trailingAnchor.constraint(equalTo: trailingAnchor),
        contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
    ])
}
于 2021-02-18T08:30:18.947 回答