UITableView上的iOS UIRefreshControl
在本教程中,我们将在iOS应用程序的UITableView上实现UIRefreshControl。
在iOS应用程序中拉动屏幕顶部时,您一定经常看到旋转的轮子。
我们将执行相同的操作。
UIRefreshControl
UIRefreshControl是一个标准的UI控件元素,它是UI套件的一部分,用于重新加载/刷新TableView,CollectionView或者ScrollView。
今天,我们将仅坚持使用UITableView。
从iOS 10开始,UITableView包含一个refreshControl
属性,可轻松将UIRefreshControl元素附加到UITableView。
UIRefreshControl包含进度指示器图标。
除了设置UIRefreshControl的背景颜色外,我们还可以选择添加标题消息。
UITableView是UIScrollView的子类,因此ScrollView中已经存在refreshControl属性。
要在Swift中创建UIRefreshControl实例,请执行以下操作:
let myRefreshControl = UIRefreshControl()
然后,我们可以将该视图添加到UITableView中,如下所示:
self.myTableView.refreshControl = myRefreshControl //or self.myTableView.addSubView(myRefreshControl)
我们可以通过以下方式在UIRefreshControl上设置标题和字体颜色:
let myString = "Pull to refresh" let myAttribute = [NSAttributedString.Key.foregroundColor: UIColor.white] let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) refreshControl.attributedTitle = myAttrString
拉UIRefreshControl时如何调用函数?在通过UIRefreshControl调用的addTarget函数内部设置函数。
refreshControl.addTarget(self, action: #selector(ViewController.handleRefresh), for: UIControl.Event.valueChanged)
执行拉动刷新手势时会触发哪个功能?
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
在此函数内部,我们可以根据UITableView被拉动刷新的速度来手动调用函数。
有时用户实际上并不想刷新。
在这种情况下,他们只是缓慢地将UITableView拉下并使其缓慢地返回其原始位置。
在这些情况下,速度较小。
在这种情况下,我们可以决定通过此功能手动不触发操作。
让我们用XCode创建一个新的Single View应用程序。
在Main.storyboard中,将UITableView添加到视图控制器,设置约束。
设置代表。
添加原型单元并设置单元标识符,如下所示:
将TableView连接到ViewController.swift文件。
现在,在ViewController.swift文件中添加以下代码:
import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var myTableView: UITableView! var myArray = ["apple","windows","amazon"] lazy var refreshControl: UIRefreshControl = { let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: #selector(ViewController.handleRefresh), for: UIControl.Event.valueChanged) return refreshControl }() override func viewDidLoad() { super.viewDidLoad() //Do any additional setup after loading the view, typically from a nib. myTableView.refreshControl = refreshControl //myTableView.addSubview(refreshControl) } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = myArray[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return myArray.count } @objc func handleRefresh() { let newElements = ["google","facebook","flipkart"] myArray.append(contentsOf: newElements) myArray.append(String(myArray.count)) myTableView.reloadData() refreshControl.endRefreshing() } }
UIRefreshControl是使用Swift中的lazy var属性创建的。
调用endRefreshing来关闭UIRefreshControl。
在上面的代码中,我们在TableView中设置了一个字符串数组。
每次刷新时,我们都会在UITableView中添加更多元素。
实际应用程序的输出如下:
现在,让我们自定义UIRefreshControl:
将viewDidLoad方法更改为:
override func viewDidLoad() { super.viewDidLoad() //Do any additional setup after loading the view, typically from a nib. myTableView.refreshControl = refreshControl let myString = "Pull to refresh" let myAttribute = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 26)] let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) refreshControl.attributedTitle = myAttrString refreshControl.tintColor = UIColor.white refreshControl.backgroundColor = UIColor.black }
我们在纺车上添加了色彩,并在完整的UI控件元素上添加了背景色。
实际应用程序的输出如下:
从UIRefreshControl删除addTarget代码行。
在ViewController类内添加以下代码:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { print(velocity) if(velocity.y < -0.1) { handleRefresh() } }
我们注意到,将UIRefreshControl下拉的速度越快,速度的负值就越高。
因此,我们添加了一个条件,该条件在值变为负值之前不会触发handleRefresh函数。
实际应用程序的输出如下:
可见,由于未刷新handleRefresh
,因此未更新值。
这是因为我们没有将其拉下来并保持接触。
当它返回并导致正速度时,我们仍然保持它。