OC/Swift 自定义下拉刷新/上拉加载实现思路

来源:互联网 时间:2017-01-22


二.系统自带的下拉刷新:{


1. iOS6以后添加,refreshControl = UIRefreshControl()'继承于UIControl';
2. 给下拉刷新添加事件:refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
3. 有默认的宽和高;
4. 添加事件的时候使用UIControlEventValueChanged进行监听

}


三.下拉刷新逻辑:{


1. since_id = homeViewMode.list.first?.statusModel?.id ?? 0;
{
a. 第一次加载的时候,list中为空.则结果为0;
b. 再次加载的时候,list不为空.结果since_id获取到list的第一个数据,此时max_id = 0(菊花没有转动,不会给max_id赋值);
c. 将since_id(有值),max_id(无值)传给loadData()方法,加载新数据;
d. 在下载中:if max_id > 0 {//上拉加载
self.list = self.list + temp
} else {//下拉刷新
self.list = temp + self.list
}
}

}


四.KVO实现{


1. 添加KVO:添加一个键值观察者{
第一个参数: 观察者; 谁是观察者,谁就要实现 一个方法
第二个参数: 观察对象的属性
第三个参数: 新值还是旧值
第四个参数: 默认填 nil
tableView.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)}
2. KVO的第二步,实现 监听方法{
observeValueForKeyPath:是NSObject的方法
参数:{
a. keyPath -- 观察的属性
b. object -- 观察的对象}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)}}

五.自定义下拉刷新:{


1. 封装下拉刷新的时候,应将KVO封装在刷新view中;
2. 在刷新view中,可通过'willMoveToSuperview'方法获取父视图"newSuperview",子控件将要添加到父类控件上去,会调用这个方法;
3. 为了提高兼容性,我们将"newSuperview"转换成"UIScrollView",这样所有的可滑动类都能使用下拉刷新;
4. 为了方便类调用,将"newSuperview"赋值给一个全局属性;
5. 判断"newSuperview"如果是"UIScrollView",则添加KVO;
6. "scrollView!.dragging":判断scrollView是否是拖拽状态{
a. 不是拖拽状态,且状态是释放就刷新状态进行刷新(也就是松手状态);
b. 是拖拽状态,则根据KVO的改变进行'三种状态'的切换;
}
7. 三种状态:status{
y = scrollView?.contentOffset.y
a. 普通状态: y>-140 文字改成"下拉刷新";
b. 释放的话就刷新:y<-140 文字改成"释放加载";
c. 松手状态: y<-140 文字改成"加载中";
}
8. 为了便于管理,将'文字变化/箭头变化/菊花转动'封装到status的didSet方法中,使用switch-case方法判断;
9. 性能优化:为了防止每次移动的时候都调用status的didSet方法,在判断距离的同时对状态进行判断,只在临界值的时候修改一
例:y < -140 && status == .Pulling!
10.箭头恢复/旋转:
self.arrowImageView.transform = CGAffineTransformIdentity
self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
11. 与父控制器通信:{
a. 闭包/代理/通知;
b. UIControl特有的方法:{
子控制器中添加方法:
sendActionsForControlEvents(UIControlEvents.ValueChanged):向所有的actions发送相关的events
在父控制器中添加监听:
refreshView.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
}
}

}




相关阅读:
Top