UIScrollView (+ MessageKit / Twilio) Загрузка сообщений, когда scrollView приближается к вершине, как WhatsApp (оптимистичная загрузка) - PullRequest
0 голосов
/ 28 января 2019

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 {
        self.loadMoreMessages()
    }
}

Или

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if scrollView.contentOffset.y < -100 {
        self.loadMoreMessages()
    }
}

Или

func scrollview(_ scrollView: UIScrollView) {
    var visibleRect = CGRect()

    visibleRect.origin = self.messagesCollectionView.contentOffset
    visibleRect.size = self.messagesCollectionView.bounds.size
    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)

    guard let indexPath = self.messagesCollectionView.indexPathForItem(at: visiblePoint) else { return }

    print(" \(indexPath)")
    if indexPath.section == 3 {
        self.loadMoreMessages()
    }
}

Но все они страдают от запаздывания или плохого пользовательского опыта,Я искал статью об этом, но не могу найти.Обратите внимание, что мои loadMoreMessages:

@objc func loadMoreMessages() {
    if channel.synchronizationStatus == .all {
        channel.messages?.getBefore(UInt(messages.count), withCount: self.FETCH_COUNT) { (result, items) in
            self.messages = self.messages.union(Set(items!))
            self.sortMessages()
            DispatchQueue.main.async {
                self.messagesCollectionView.reloadData()
                self.messagesCollectionView.reloadDataAndKeepOffset()
                self.refreshControl.endRefreshing()
            }
        }
    }
}

Мысли об этом были бы великими.

...