ios - UICollectionView 不会滚动到项目(在:IndexPath,在:位置)
问题描述
我正在使用这种方法来滚动我的收藏视图。
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}; layout: ; 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()
其他地方使用相同的方法时,视图会滚动到它应该的最后一项 - 但只有在视图手动滚动到底部之后。我也尝试将代码移动到viewDidAppear
下面的答案,但没有效果。
解决方案
调用时viewDidLoad
,将加载所有视图,但我发现集合视图和表视图不一定已加载所有数据。尝试调用您的滚动方法viewWillAppear
或viewDidAppear
代替。
推荐阅读
- sql - SQL - 如何从联合表中搜索单行?
- javascript - 如何缩放元素保持当前元素位置
- java - Java中不正确的逻辑
- python-3.x - 无法使用 RASA 运行 actions.py 文件以创建聊天机器人
- python - Python/Q#:未找到模块错误,.qs 文件位于同一目录中
- java - Jira 弹出消息
- php - Ajax POST 与 mysqli 数据库查询
- azure-ad-graph-api - Microsoft Graph API:为具有应用程序权限的多租户应用程序获取 ErrorAccessDenied
- makefile - 在 AOSP 中使用 soong build Android.bp 时找不到头文件
- excel - 将单元格复制到另一个工作表