XZ_Swift之刷新的原理及实现、美团刷新

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

判断用户是否拖

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值