2016-10-21 7 views
0

電報、Whatsupなどのようにジャンプせずにトップにスクロールしているとき(チャットの履歴を見るために)、新しい部分の情報を追加することを実装しようとしていますscrolltoitematindexpathが常に同じ位置に戻る

はここで、私はそれは私が(新しい部分を追加した期待どおりに動作先頭にスクロールしていたときに

func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    addMoreCells() 
} 

初回から起動された私の方法

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) 
     }) 
    } 
} 

はnジャンプする。私は新しいデータを見ることができ、上にスクロールし続けることができます)、上にスクロールして新しいデータを追加すると、最初の情報が追加されたときに常にその位置に戻ります。

しかし、値messages.count - messagesFromServer.countに戻るはずです。 xCodeでは、スクロールするたびに数値が変更されますが、が正しく機能しません。

そして、上にスクロールして新しいデータを追加するたびに、最初の情報を添加した。

誰でも問題を知ることができますか?私はそれを解決する解決策を見つけることができません。

答えて

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) 

私は期待していたように素晴らしい作品です。

関連する問題