在 iOS 12 中,当 UICollectionView 是使用带约束的自调整大小单元格创建时,重新加载布局时高度错误,直到我滚动
In iOS 12, when UICollectionView is created using Self Sizing cells with constraints, upon reload layout has wrong height until I scroll
我在 iOS 12 中遇到了一个奇怪的问题,当我按照 here 解释的那样使用解决方案时。
第一次加载集合视图时效果很好,但是当我尝试使用 collectionView.reloadData()
或 collectionView.collectionViewLayout.invalidateLayout()
重新加载集合视图时,添加了一个奇怪的单元格高度。
一旦我开始滚动,一切都会恢复正常。请看下面的图片。第一张图片显示了视图加载后单元格的工作高度。第二个显示按下重新加载后的单元格。
刷新栏按钮调用以下方法。
@objc func reloadCollectionView() {
collectionView.collectionViewLayout.invalidateLayout()
}
请查看 GitHub here 中的示例项目以重现问题。我使用 Xcode 10.1 和 10.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 的错误方法。
在iOS 12 中,contentView 通过itemsSize default(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)
])
}
我在 iOS 12 中遇到了一个奇怪的问题,当我按照 here 解释的那样使用解决方案时。
第一次加载集合视图时效果很好,但是当我尝试使用 collectionView.reloadData()
或 collectionView.collectionViewLayout.invalidateLayout()
重新加载集合视图时,添加了一个奇怪的单元格高度。
一旦我开始滚动,一切都会恢复正常。请看下面的图片。第一张图片显示了视图加载后单元格的工作高度。第二个显示按下重新加载后的单元格。
刷新栏按钮调用以下方法。
@objc func reloadCollectionView() {
collectionView.collectionViewLayout.invalidateLayout()
}
请查看 GitHub here 中的示例项目以重现问题。我使用 Xcode 10.1 和 10.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 的错误方法。
在iOS 12 中,contentView 通过itemsSize default(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)
])
}