问题描述
我有一个UIRefreshControl
确实很好用,它在向下滚动时会调用该函数,但问题是它没有动画效果,我的代码没有发现任何问题,还有其他方法可以解决吗?我看不出会导致此问题吗?
这是我现在得到的结果
如您在GIF中所看到的,UIRefreshControl
上没有动画,但仍调用该函数,
import UIKit
class DummyTableViewController: UITableViewController {
var arr: [Int] = [1,2,3]
var refresher: UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
refresher = UIRefreshControl()
refresher.attributedTitle = nil
refresher.backgroundColor = .clear
refresher.tintColor = .black
refresher.addTarget(self,action: #selector(populate),for: .valueChanged)
tableView.addSubview(refresher)
}
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation,return the number of rows
return arr.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier",for: indexPath)
cell.textLabel?.text = String(arr[indexPath.row])
// Configure the cell...
return cell
}
@objc func populate() {
for i in 1...1000 {
arr.append(i)
}
dispatchQueue.main.asyncAfter(deadline: .Now() + 3) {
self.refresher.endRefreshing()
self.tableView.reloadData()
}
}
}
我应该如何知道导致此问题的原因以及如何解决?
PS。我编辑了代码和gif结果,似乎答案和注释在我的第一个代码上感到困惑,所以我在刷新之前花了点时间。
解决方法
load
没什么可做的。假设您需要花费一些时间从数据库中提取数据。当refreshing
时,需要花费几秒钟的时间,您会看到圆圈正在动画。但是在您的情况下,实际上没有什么可加载的。您只需使用简单的integers
来填充它,这并不需要足够的时间,因此refreshControl
实际上必须animate
。
您没有看到动画,因为endRefreshing
方法被立即调用。要观看动画,您可以稍作延迟。方法如下:
@objc func populate() {
for i in 1...1000 {
arr.append(i)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
self.refresher.endRefreshing()
self.tableView.reloadData()
}
}
,
您应该设置一些延迟,并且可以在下面使用扩展名来进行滚动查看。因此您的代码将是:
import UIKit
class DummyTableViewController: UITableViewController {
var arr: [Int] = [1,2,3]
private lazy var refresher = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refresher = UIRefreshControl()
refresher.attributedTitle = nil
refresher.backgroundColor = .clear
refresher.tintColor = .black
refresher.addTarget(self,action: #selector(populate),for: .valueChanged)
tableView.refreshControl = refreshControl
tableView.addSubview(refresher)
}
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation,return the number of rows
return arr.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier",for: indexPath)
cell.textLabel?.text = String(arr[indexPath.row])
// Configure the cell...
return cell
}
@objc func populate() {
for i in 1...1000 {
arr.append(i)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
self.refresher.endRefreshing()
self.tableView.reloadData()
}
}
}
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y < 0 {
topConstraint.constant = -scrollView.contentOffset.y/2
} else {
topConstraint.constant = 0
}
}
}