4

私は電報のようなメッセンジャーアプリを作ってJSQMessageViewControllerいます。チャットに使用する無限スクロールを実装したいと思います。

これは無限スクロールのコードです:

 override func scrollViewDidScroll(scrollView: UIScrollView) {
   if(scrollView.contentOffset.y >= 0.0 && scrollView.contentOffset.y <= 30.0 && loading == true){
        self.loading = false
        self.loadMore()
    }
}

次に、この関数を呼び出します。

func loadMore() {

            //Controllo se nell'array sono presenti altri messaggi
            if ((chatList?.messages.count)!-1) != self.messages.count{
               //
                CATransaction.begin()
                CATransaction.setDisableActions(true)

                let oldBottomOffset = self.collectionView!.contentSize.height - self.collectionView!.contentOffset.y
                UIView.performWithoutAnimation({ () -> Void in


                self.collectionView!.performBatchUpdates({ () -> Void in

                    let idInit = (self.lastMessageId-self.messagePerPage<0) ? 0 : self.lastMessageId-1-self.messagePerPage
                    let idEnd  = self.lastMessageId-1

                    var indexPaths: [NSIndexPath] = []
                    for(var i = 0; i<idEnd-idInit; i++){
                        print("Creo indexpath \(i)")
                        indexPaths.append(NSIndexPath(forItem: i, inSection: 0))
                    }

                    self.collectionView!.insertItemsAtIndexPaths(indexPaths)

                    let msg = self.chatList?.messages
                    var i = idEnd
                    repeat {
                        let mg = msg![i]
                        let messagechat:JSQMessage = JSQMessage(senderId: mg.sender, senderDisplayName: "", date:mg.time, text: mg.message)
                        messagechat.xmppMessageID = mg.messageID
                        messagechat.status        = mg.messageStatus
                        self.messages.insert(messagechat, atIndex: 0)
                        self.lastMessageId = i
                        i--
                    } while i > idInit

                    // invalidate layout
                    self.collectionView!.collectionViewLayout.invalidateLayoutWithContext(JSQMessagesCollectionViewFlowLayoutInvalidationContext())

                    }, completion: {(finished) in

                        //scroll back to current position
                        self.finishReceivingMessageAnimated(false)
                        self.collectionView!.layoutIfNeeded()
                        self.collectionView!.contentOffset = CGPointMake(0, self.collectionView!.contentSize.height - oldBottomOffset)
                        CATransaction.commit()


                })
                     })
            }
            else {

                print("No more messages to load.")
            }


}

すべて正常に動作しますがscrolling、スクロールが1秒間停止している間。これを行うと、ジャンプ効果が見られることがあると思いますCATransaction.10の新しいメッセージを追加すると、10の最初のメッセージが一瞬表示され、オフセットが古い位置に正しく設定されます. どうすればこれを修正できますか? テレグラムscrollingは完璧で、古いメッセージの読み込み中にジャンプ効果はありません。

4

0 に答える 0