UIScrollView 中的 UIRefreshControl 在结束刷新时不会消失
UIRefreshControl in UIScrollView Doesn't disappear on endRefreshing
我尝试在 UIScrollView 中使用 UIRefreshControll,但我遇到了问题,我需要滚动很多才能让它刷新。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新。
现在的问题是,有时 endRefreshing 函数不会使 UIRefreshControll 视图消失,我最终将它永远保留在那里。
我曾尝试在主队列中延迟调用 endRefreshing,但它不起作用。我也试过将 isHidden 设置为 true 和 removeFromSuperView。我没能成功。
import UIKit
class RefreshableView : UIView {
@IBOutlet weak var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
private var canRefresh = true
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = ColorName.grayColor.color
scrollView.refreshControl = refreshControl
}
func endRefreshing() {
self.refreshControl.endRefreshing()
}
}
extension RefreshableView: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y < -100 {
if canRefresh && !self.refreshControl.isRefreshing {
self.canRefresh = false
self.refreshControl.beginRefreshing()
self.refreshFunction?()
}
} else if scrollView.contentOffset.y >= 0 {
self.canRefresh = true
}
}
}
滚动视图的 refreshControl
会自动处理 pull-to-refresh 功能,因此您不需要任何 scrollViewDidScroll()
代码。
假设您的故事板看起来像这样,其中:
- 红色背景的视图是
RefreshableView
class 的实例
- 它包含一个滚动视图(通过
@IBOutlet
连接)
- 和滚动视图中的一些内容(这里我只有一个标签)
你的代码可以是这样的:
class RefreshableView : UIView {
@IBOutlet var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = .gray
refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
scrollView.refreshControl = refreshControl
}
@objc func didPullToRefresh() {
print("calling refreshFunction in controller")
self.refreshFunction?()
}
func endRefreshing() {
print("end refreshing called from controller")
self.refreshControl.endRefreshing()
}
}
class RefreshTestViewController: UIViewController {
@IBOutlet var theRefreshableView: RefreshableView!
override func viewDidLoad() {
super.viewDidLoad()
theRefreshableView.setupUI()
theRefreshableView.refreshFunction = {
print("simulating refresh for 2 seconds...")
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
[weak self] in
guard let self = self else { return }
// do what you want to update the contents of theRefreshableView
// ...
// then tell theRefreshableView to endRefreshing
self.theRefreshableView.endRefreshing()
}
}
}
}
我尝试在 UIScrollView 中使用 UIRefreshControll,但我遇到了问题,我需要滚动很多才能让它刷新。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新。
现在的问题是,有时 endRefreshing 函数不会使 UIRefreshControll 视图消失,我最终将它永远保留在那里。
我曾尝试在主队列中延迟调用 endRefreshing,但它不起作用。我也试过将 isHidden 设置为 true 和 removeFromSuperView。我没能成功。
import UIKit
class RefreshableView : UIView {
@IBOutlet weak var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
private var canRefresh = true
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = ColorName.grayColor.color
scrollView.refreshControl = refreshControl
}
func endRefreshing() {
self.refreshControl.endRefreshing()
}
}
extension RefreshableView: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y < -100 {
if canRefresh && !self.refreshControl.isRefreshing {
self.canRefresh = false
self.refreshControl.beginRefreshing()
self.refreshFunction?()
}
} else if scrollView.contentOffset.y >= 0 {
self.canRefresh = true
}
}
}
滚动视图的 refreshControl
会自动处理 pull-to-refresh 功能,因此您不需要任何 scrollViewDidScroll()
代码。
假设您的故事板看起来像这样,其中:
- 红色背景的视图是
RefreshableView
class 的实例
- 它包含一个滚动视图(通过
@IBOutlet
连接) - 和滚动视图中的一些内容(这里我只有一个标签)
你的代码可以是这样的:
class RefreshableView : UIView {
@IBOutlet var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = .gray
refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
scrollView.refreshControl = refreshControl
}
@objc func didPullToRefresh() {
print("calling refreshFunction in controller")
self.refreshFunction?()
}
func endRefreshing() {
print("end refreshing called from controller")
self.refreshControl.endRefreshing()
}
}
class RefreshTestViewController: UIViewController {
@IBOutlet var theRefreshableView: RefreshableView!
override func viewDidLoad() {
super.viewDidLoad()
theRefreshableView.setupUI()
theRefreshableView.refreshFunction = {
print("simulating refresh for 2 seconds...")
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
[weak self] in
guard let self = self else { return }
// do what you want to update the contents of theRefreshableView
// ...
// then tell theRefreshableView to endRefreshing
self.theRefreshableView.endRefreshing()
}
}
}
}