我正在使用此方法滚动我的收藏夹视图。
import UIKit
extension UICollectionView {
func scrollToLast() {
guard numberOfSections > 0 else {
print("number of sections < 0")
return
}
let lastSection = numberOfSections - 1
guard numberOfItems(inSection: lastSection) > 0 else {
print("number of items < 0")
return
}
let lastItemIndexPath = IndexPath(item: numberOfItems(inSection: lastSection) - 1,section: lastSection)
self.scrollToItem(at: lastItemIndexPath,at: .centeredVertically,animated: true)
print("last Item (section,item #): \(lastItemIndexPath)")
}
}
在加载视图并且集合视图中包含项之后,我才调用此方法。直到我在单元格原型中添加标签之前,它一直在工作,现在,尽管使用新标签看起来像该视图,但是使用此方法不会滚动任何内容。我仍然可以手动滚动视图。注意:调用该方法时,上述方法的输出正确列出了最后一个indexPath的最后一项。
控制台中出现以下警告/错误,但似乎与滚动调用时不一致,所以不确定其相关性:
2019-11-04 06:01:13.017384-0800 AppName [17598:4494554] [CollectionView]在prepareLayout调用正在进行中(即,可重入调用)时尝试准备布局的尝试已被忽略。请提交错误。 UICollectionView实例为(; layer =; contentOffset:{0,0}; contentSize:{0,0}; AdjustedContentInset:{0,0,0,0};布局:; dataSource:appBundle.instance
我如何称呼它为例:(这在viewDidLoad中)
DataService.instance.messageListener(roomId: room.id,{ (result) in
self.messageArr.append(result)
self.messageArr = self.messageArr.sorted(by: { $0.date < $1.date})
self.collection.reloadData()
self.collection.scrollToLast()
self.messageTextArea.text = ""
})
编辑:我已经删除了对主队列的所有调用,并且行为已更改。现在,当触发messageListener方法时,该视图将滚动到集合视图的顶部,但是在其他地方使用相同的scrollToLast()
方法时,该视图将按原样滚动到最后一个项目-但只有 after 将该视图手动滚动到底部。我还尝试按照下面的答案将代码移至viewDidAppear
,但没有任何效果。