我想要做的是在我的内容加载后立即将CollectionView
滚动到最底层。
这是我的代码;
func bindSocket(){
APISocket.shared.socket.on("send conversation") { (data, ack) in
let dataFromString = String(describing: data[0]).data(using: .utf8)
do {
let modeledMessage = try JSONDecoder().decode([Message].self, from: dataFromString!)
self.messages = modeledMessage
DispatchQueue.main.async {
self.collectionView.reloadData()
let indexPath = IndexPath(item: self.messages.count - 1, section: 0)
self.collectionView.scrollToItem(at: indexPath, at: .bottom, animated: false)
}
} catch {
//show status bar notification when socket error occurs
}
}
}
但它完全不起作用。
顺便说一句,我正在使用InputAccessoryView
作为粘性数据输入栏,例如在iMessage中使用collectionView.keyboardDismissMode = .interactive
感谢,
答案 0 :(得分:0)
我想到你可以在collectionView之前调用func获取可见单元格或调用reload collection视图然后立即滚动项目,此时滚动到indexPath将没有意义,因为集合视图' s内容大小尚未更新。
<强> scrollToItem(在:在:动画:)强>
滚动集合视图内容,直到指定的项目可见。
试试这个:
self.collectionView.reloadData()
let indexPath = IndexPath(item: self.messages.count - 1, section: 0)
let itemAttributes = self.collectionView.layoutAttributesForItem(at: indexPath)
self.collectionView.scrollRectToVisible(itemAttributes!.frame, animated: true)