我试图在顶部添加新的信息部分,当用户滚动到顶部(查看聊天记录)时没有像Telegram,Whatsup等那样跳跃
这是我的方法
private var toItem: NSIndexPath?
private func addMoreCells () {
if collectionView.contentOffset.y <= 0 {
guard let userChatUid = user?.chatUid else { return }
guard let ownChatUid = UsersManager.sharedInstance.currentChatUID() else { return }
guard let offset = conversation?.messages.count else { return }
ConversationsManager.sharedInstance.getConversationsWithMoreMessagesFor(ownChatUid, recipient: userChatUid, offset: offset - 1, successHandler: { [weak weakSelf = self] (conversations) in
dispatch_async(dispatch_get_main_queue()) {
if let messagesFromServer = conversations.first?.messages, var messages = weakSelf?.conversation?.messages {
for message in messagesFromServer {
if !messages.contains(message) {
messages.append(message)
}
}
messages = messages.sort({$0.time?.compare($1.time!) == .OrderedAscending})
weakSelf?.conversation?.messages = messages
weakSelf?.collectionView.reloadData()
weakSelf?.toItem = NSIndexPath(forItem: (messages.count - messagesFromServer.count), inSection: 0)
if let item = weakSelf?.toItem{
weakSelf?.collectionView.scrollToItemAtIndexPath(item, atScrollPosition: .Top, animated: false)
}
}
}
}, failHandler: { (error) in
print(error)
})
}
}
从
启动func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
addMoreCells()
}
我第一次滚动到顶部它按预期工作(添加了新部分,没有跳跃。我可以看到新数据并可以继续滚动到顶部),但是当我继续滚动到顶部时添加了顶部和新数据,当添加第一个信息时,它总是返回到该位置。
但我希望它应该返回值messages.count - messagesFromServer.count
。在xCode中,我看到每次滚动时数字都会更改,但scrollToItemAtIndexPath
无法正常工作
每当我滚动到顶部并添加新数据时,它会在添加第一个信息时返回到第一个位置。
任何人都可以知道问题所在吗?因为我无法找到解决方案来解决它。
答案 0 :(得分:0)
我已经解决了这个问题:
在reloadData()
我保存集合视图的contentSize
之后,我刷新布局,获取新的contentSize
并减去它们以获得所需的偏移量以滚动到这个地方而不跳跃。
weakSelf?.collectionView.reloadData()
guard let previousContentSize = weakSelf?.collectionView.contentSize else { return }
weakSelf?.collectionView.collectionViewLayout.invalidateLayout()
weakSelf?.collectionView.collectionViewLayout.prepareLayout()
weakSelf?.collectionView.layoutIfNeeded()
guard let newContentSize = weakSelf?.collectionView.contentSize else { return }
print("previous Content Size \(previousContentSize) and new Content Size \(newContentSize)")
let contentOffset = newContentSize.height - previousContentSize.height
weakSelf?.collectionView.setContentOffset(CGPoint(x: 0.0, y: contentOffset), animated: false)
我的工作很棒,正如我所料。