1、简单刷新
苹果默认的刷新控件存在的问题:
1>拉到一定距离自动刷新,即使用户没有松手也会刷新,给用户的体验不好,且浪费用户的流量;
2>调用 beginRefreshing,不显示菊花转圈;
刷新的实现思路:
1>、保证用户拉到足够距离之后,放手,才会刷新;
2>、继承自 UIControl,所有的接口定义和苹果原生基本一致,通过 KVO 监听刷新控件的 contentOffset
创建3个文件:
XZRefreshControl - 负责 刷新 相关的’逻辑’处理
XZRefreshView - 负责 刷新 相关的 UI 显示和动画
XZRefreshView.xib - 跟 XZRefreshView 进行关联,负责页面的搭建
在 XZRefreshControl 中
定义记录属性,记录父视图,父视图应该是scrollView或其子类
private weak var scrollView: UIScrollView?
weak的原因:因为父视图本身会对他强引用,addSubView 由父视图来调用,父视图对刷新控件进行强引用,如果刷新控件再对父视图进行强引用,就会造成循环引用
在 willMove toSuperview 方法中,使用 KVO 监听父视图的 contentOffset,并且计算刷新控件的高度,使用 addSubView 添加刷新控件的时候,会调用当前方法
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
// 判断父视图的类型
guard let sv = newSuperview as? UIScrollView else {
return
}
// 记录父视图
scrollView = sv
// KVO监听父视图的 contentOffset
scrollView?.addObserver(self, forKeyPath: "contentOffset", options: [], context: nil)
}
注意:使用完 KVO 必须释放,否则会引起程序的崩溃
在 removeFromSuperview 中移除监听
注意:要在调用 super.removeFromSuperview( ) 之前移除,因为调用 super.removeFromSuperview( ) 之后,super 就不存在了
override func removeFromSuperview() {
// superView 还存在
superview?.removeObserver(self, forKeyPath: "contentOffset”)
super.removeFromSuperview()
// superView 不存在
}
添加 KVO 的监听方法,在监听方法中监听父视图的 contentOffset;
判断临界点:
private let XZRefreshOffset: CGFloat = 60
判断用户是否拖