From 30eb46d646e019f48a036d74967408707da34dba Mon Sep 17 00:00:00 2001 From: Fin Date: Thu, 2 Jan 2025 15:02:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20UIRefreshControl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controller/MessageListViewController.swift | 36 +++++++++++++++++----- Controller/MessageListViewModel.swift | 1 - 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Controller/MessageListViewController.swift b/Controller/MessageListViewController.swift index e2dbfe51..a17e62f2 100644 --- a/Controller/MessageListViewController.swift +++ b/Controller/MessageListViewController.swift @@ -47,10 +47,6 @@ class MessageListViewController: BaseViewController { return UIBarButtonItem(customView: btn) }() - private var expandedGroup: Set = [] - - private let itemDeleteInGroupRelay = PublishRelay() - lazy var tableView: UITableView = { let tableView = UITableView() tableView.separatorStyle = .none @@ -66,10 +62,19 @@ class MessageListViewController: BaseViewController { tableView.rx.setDelegate(self).disposed(by: rx.disposeBag) tableView.mj_footer = MJRefreshAutoFooter() - tableView.refreshControl = UIRefreshControl() return tableView }() + + /// 展开的群组 + private var expandedGroup: Set = [] + /// 下拉刷新标记字段 + private var canRefresh = true + + /// 群组中删除消息的事件流 + private let itemDeleteInGroupRelay = PublishRelay() + /// 下拉刷新事件流 + private let refreshRelay = PublishRelay() override func makeUI() { navigationItem.searchController = UISearchController(searchResultsController: nil) @@ -104,7 +109,7 @@ class MessageListViewController: BaseViewController { return false } .subscribe(onNext: { [weak self] _ in - self?.tableView.refreshControl?.sendActions(for: .valueChanged) + self?.refreshRelay.accept(()) }).disposed(by: rx.disposeBag) // 点击群组消息,展开群 @@ -190,7 +195,7 @@ class MessageListViewController: BaseViewController { let output = viewModel.transform( input: MessageListViewModel.Input( - refresh: tableView.refreshControl!.rx.controlEvent(.valueChanged).asDriver(), + refresh: refreshRelay.asDriver(onErrorDriveWith: .empty()), loadMore: tableView.mj_footer!.rx.refresh.asDriver(), itemDelete: tableView.rx.modelDeleted(MessageListCellItem.self).asDriver(), itemDeleteInGroup: itemDeleteInGroupRelay.asDriver(onErrorDriveWith: .empty()), @@ -371,4 +376,21 @@ extension MessageListViewController: UISearchControllerDelegate { searchController.searchBar.searchTextField.sendActions(for: .editingDidEnd) } } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let offset = scrollView.contentOffset.y + scrollView.adjustedContentInset.top + if offset <= -10 && canRefresh { + // 触发下拉刷新,并震动 + canRefresh = false + UIImpactFeedbackGenerator(style: .light).impactOccurred() + refreshRelay.accept(()) + } + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + let offset = scrollView.contentOffset.y + scrollView.adjustedContentInset.top + if offset >= 0 && !canRefresh { + canRefresh = true + } + } } diff --git a/Controller/MessageListViewModel.swift b/Controller/MessageListViewModel.swift index f9841973..3ecbb19a 100644 --- a/Controller/MessageListViewModel.swift +++ b/Controller/MessageListViewModel.swift @@ -253,7 +253,6 @@ class MessageListViewModel: ViewModel, ViewModelType { Observable .merge( input.refresh.asObservable().map { () }, - filterGroups.map { _ in () }, input.searchText.asObservable().map { _ in () }, messageTypeChanged.asObservable().map { _ in () } )