您的位置:首页 > 移动开发 > Swift

XZ_Swift之使用苹果原生UIRefreshControl实现下拉刷新和上拉加载

2017-12-06 11:46 411 查看
实现的效果图



系统的 UIRefreshControl 的属性很少,就只有下面几个:

isRefreshing: Bool 判断是否正在刷新

tintColor: UIColor! 修改菊花的颜色,默认是灰色的

attributedTitle: NSAttributedString? 给刷新添加文字显示

beginRefreshing() 开始刷新

endRefreshing() 结束刷新

因为 UIRefreshControl 是继承自 UIControl,所有UIControl 的方法,他都可以使用,常用的有 添加事件

addTarget(_ target: Any?, action: Selector, for controlEvents: UIControlEvents)

实现的主要核心处理部分是上拉加载:上拉加载需要做无缝加载,需要判断是不是最后一个 section 的最后一行,如果是,拖拽时进行 上拉加载 并刷新页面

代码实现:

private let cellId = "XZTableViewCell"

class ViewController: UIViewController {

private var tableView: UITableView?
// 懒加载数据数组
private lazy var dataArr = [String]()
// 判断是否是上提加载
var isPullUp = false
// 刷新控件
var refreshControl: UIRefreshControl?

override func viewDidLoad() {
super.viewDidLoad()
// 设置页面
setupUI()
// 加载数据
loadData()
}

@objc private func loadData() {
// 模拟数据延时
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 2) {
print("开始加载数据")
if self.isPullUp { // 上提加载
for i in 0..<20 {
self.dataArr.append("加载 - 第\(i.description)行")
}
}else { // 下拉刷新
self.dataArr.removeAll()
for i in 0..<20 {
self.dataArr.append("第\(i.description)行")
}
}

print("==========\(self.isPullUp)")
self.isPullUp = false
// 结束刷新
self.refreshControl?.endRefreshing()
// 刷新数据
self.tableView?.reloadData()
print("结束加载数据")
}
}

}

// MARK: - 设置页面
extension ViewController {

private func setupUI() {
// 初始化tableView
tableView = UITableView(frame: view.bounds, style: .plain)
view.addSubview(tableView!)

tableView?.backgroundColor = .white

tableView?.delegate = self
tableView?.dataSource = self

tableView?.register(UITableViewCell.self, forCellReuseIdentifier: cellId)

// 设置刷新控件
refreshControl = UIRefreshControl()
tableView?.addSubview(refreshControl!)

refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
}

}

// MARK: - UITableViewDelegate,UITableViewDataSource
extension ViewController: UITableViewDelegate,UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArr.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)

cell.textLabel?.text = dataArr[indexPath.row]

return cell
}

// 上拉需要做无缝刷新,使用下面的方法:判断是不是最后一个 section 的最后一行,如果是,拖拽时进行 上拉加载 并刷新页面
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// 当前行
let row = indexPath.row
// 最后一个section
let section = tableView.numberOfSections - 1

if row < 0 || section < 0 {
return
}
// 最后一行
let lastRow = tableView.numberOfRows(inSection: section) - 1

if row == lastRow {
isPullUp = true
loadData()
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: