2016-10-21 5 views
0

Я пытаюсь реализовать добавление новой части информации вверху, когда пользователь прокручивается вверх (чтобы просмотреть историю чата) без каких-либо прыжков, как в Telegram, Whatsup и т. Д.scrolltoitematindexpath всегда возвращается в ту же позицию

Вот мой метод

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

Первый раз, когда я прокрутки к началу Он работает, как я ожидал (новая порция добавляется, п o прыжки. Я вижу новые данные и могу продолжать прокручивать вверх), но когда я продолжаю прокручивать верх и новые данные добавляются, он всегда возвращается к позиции, когда была добавлена ​​первая информация.

Но я ожидаю, что он должен вернуться к значению messages.count - messagesFromServer.count. В xCode я вижу, что числа меняются каждый раз, когда я прокручиваю, но scrollToItemAtIndexPath не работает должным образом

И каждый раз, когда я прокручиваю верх и новые данные, он всегда возвращается в первую позицию, когда первая информация был добавлен.

Может ли кто-нибудь узнать, в чем проблема? Потому что я не могу найти решения, чтобы исправить это.

ответ

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) 

Я отлично работаю и, как я ожидал.

Смежные вопросы