scrolltoitematindexpath始终返回到相同的位置

时间:2016-10-21 06:49:34

标签: swift uiscrollview uicollectionview

我试图在顶部添加新的信息部分,当用户滚动到顶部(查看聊天记录)时没有像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无法正常工作

每当我滚动到顶部并添加新数据时,它会在添加第一个信息时返回到第一个位置。

任何人都可以知道问题所在吗?因为我无法找到解决方案来解决它。

1 个答案:

答案 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)

我的工作很棒,正如我所料。