1

我花了一段时间在互联网上搜索,但没有找到一个好的解决方案。基本上问题是,在我的 messagecollectionview(例如,像任何应用程序上的消息列表)中,我想要一种智能且流畅的方式来重新加载消息,而不会弄乱视图的 UI,并且不需要使用拖拽看法。我找到了一些解决方案,例如

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

对这件事的想法会很棒。

4

0 回答 0