Skip to content
This repository was archived by the owner on Jul 1, 2020. It is now read-only.

Commit 9032be7

Browse files
重新定义API,完善淘宝和大众点评Demo
1 parent 6ed705e commit 9032be7

11 files changed

+102
-70
lines changed

PullToRefreshKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Pod::Spec.new do |s|
1010
s.name = 'PullToRefreshKit'
11-
s.version = '0.1.1'
11+
s.version = '0.2.0'
1212
s.summary = 'A refresh library written with pure Swift'
1313
s.description = <<-DESC
1414
This is a pull to refresh library written by pure Swift. Using it you can add pull to refresh,pull to load more,pull left/right to view details within one line. Besides,it is quite easy to write a custom refresh view when using this lib.

PullToRefreshKit/DefaultTableViewController.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ class DefaultTableViewController:UITableViewController{
2424
delay(1.5, closure: {
2525
self?.models.append(random100())
2626
self?.tableView.reloadData()
27-
self?.tableView.endFooterRefreshing()
27+
if self?.models.count < 15{
28+
self?.tableView.endFooterRefreshing()
29+
}else{
30+
self?.tableView.endFooterRefreshingWithNoMoreData()
31+
}
2832
})
2933
}
3034
self.tableView.beginHeaderRefreshing()

PullToRefreshKit/DianpingRefreshHeader.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import Foundation
1010
import UIKit
1111
class DianpingRefreshHeader:UIView,RefreshableHeader{
12-
1312
let imageView = UIImageView()
1413
override init(frame: CGRect) {
1514
super.init(frame: frame)
@@ -25,28 +24,34 @@ class DianpingRefreshHeader:UIView,RefreshableHeader{
2524
func distanceToRefresh()->CGFloat{
2625
return 70
2726
}
28-
func percentageChangedDuringDragging(percent:CGFloat){
29-
imageView.hidden = false
27+
//监听百分比变化
28+
func percentUpdateWhenNotRefreshing(percent:CGFloat){
29+
imageView.hidden = (percent == 0)
3030
let adjustPercent = max(min(1.0, percent),0.0)
3131
let scale = 0.2 + (1.0 - 0.2) * adjustPercent;
3232
imageView.transform = CGAffineTransformMakeScale(scale, scale)
3333
let mappedIndex = Int(adjustPercent * 60)
3434
let imageName = "dropdown_anim__000\(mappedIndex)"
35-
print(imageName)
3635
let image = UIImage(named: imageName)
3736
imageView.image = image
3837
}
39-
func willBeginRefreshing(){
38+
//松手即将刷新的状态
39+
func releaseWithRefreshingState(){
4040
let images = ["dropdown_loading_01","dropdown_loading_02","dropdown_loading_03"].map { (name) -> UIImage in
4141
return UIImage(named:name)!
4242
}
4343
imageView.animationImages = images
4444
imageView.animationDuration = 0.6
4545
imageView.startAnimating()
4646
}
47-
func willEndRefreshing(result:RefreshResult){}
48-
func didEndRefreshing(result:RefreshResult){
47+
//刷新结束,将要隐藏header
48+
func didBeginEndRefershingAnimation(result:RefreshResult){
49+
50+
}
51+
//刷新结束,完全隐藏header
52+
func didCompleteEndRefershingAnimation(result:RefreshResult){
53+
imageView.animationImages = nil
54+
imageView.stopAnimating()
4955
imageView.hidden = true
5056
}
51-
func didBeginRefreshing(){}
5257
}

PullToRefreshKit/DianpingTableviewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ class DianpingTableviewController:CustomBaseTableViewController{
2222
self?.tableView.endHeaderRefreshing(.Success)
2323
})
2424
}
25+
self.tableView.beginHeaderRefreshing()
2526
}
2627
}

PullToRefreshKit/TaoBaoRefreshHeader.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
6868
func distanceToRefresh()->CGFloat{
6969
return 60
7070
}
71-
func didBeginRefreshing(){
72-
73-
}
74-
func percentageChangedDuringDragging(percent:CGFloat){
71+
func percentUpdateWhenNotRefreshing(percent:CGFloat){
7572
let adjustPercent = max(min(1.0, percent),0.0)
7673
self.circleLayer.strokeEnd = 0.05 + (0.95 - 0.05) * adjustPercent
7774
if adjustPercent == 1.0{
@@ -80,7 +77,7 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
8077
textLabel.text = "下拉即可刷新..."
8178
}
8279
}
83-
func willBeginRefreshing(){
80+
func releaseWithRefreshingState(){
8481
self.circleLayer.strokeEnd = 0.95
8582
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
8683
rotateAnimation.toValue = NSNumber(double: M_PI * 2.0)
@@ -91,11 +88,11 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
9188
self.arrowLayer.hidden = true
9289
textLabel.text = "刷新中..."
9390
}
94-
func willEndRefreshing(result:RefreshResult){
91+
func didBeginEndRefershingAnimation(result:RefreshResult){
9592
self.circleLayer.strokeEnd = 0.05
9693
self.circleLayer.removeAllAnimations()
9794
}
98-
func didEndRefreshing(result:RefreshResult){
95+
func didCompleteEndRefershingAnimation(result:RefreshResult){
9996
self.circleLayer.strokeEnd = 0.05
10097
self.arrowLayer.hidden = false
10198
textLabel.text = "下拉即可刷新"

PullToRefreshKit/TaobaoTableViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ class TaobaoTableViewController:CustomBaseTableViewController{
2121
self?.tableView.endHeaderRefreshing(.Success)
2222
})
2323
}
24+
self.tableView.beginHeaderRefreshing()
2425
}
2526
}

README.md

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ self.tableView.setUpHeaderRefresh { [weak self] in
1616
})
1717
}
1818
```
19+
这个库的设计初衷,是为了能够方便地实现自定义的下拉刷新,上拉加载等。比如,Demo中,我用了不到60行,就实现了大众点评的下拉刷新。实例代码:[DianpingRefreshHeader.swift](https://github.com/LeoMobileDeveloper/PullToRefreshKit/blob/master/PullToRefreshKit/DianpingRefreshHeader.swift)
1920

2021
## 要求
2122

@@ -116,23 +117,26 @@ self.tableView.setUpHeaderRefresh { [weak self] in
116117

117118
例如,Demo工程[TaoBaoRefreshHeader.swift](https://github.com/LeoMobileDeveloper/PullToRefreshKit/blob/master/PullToRefreshKit/TaoBaoRefreshHeader.swift)中实现了淘宝App的下拉刷新例子。
118119

119-
你只需要根据协议提供的回调来更新时图的状态
120+
你只需要根据协议提供的回调来更新Header的状态
120121

121122
这个协议提供的方法如下
122123

123124
```
124-
//触发刷新的距离,也是header的高度
125+
//触发刷新的距离,对于header/footer来讲,就是视图的高度;对于left/right来讲,就是视图的宽度
125126
func distanceToRefresh()->CGFloat
126-
//已经开始刷新的回调
127-
func didBeginRefreshing()
128-
//拖拽过程中,拖拽百分比的回调
129-
func percentageChangedDuringDragging(percent:CGFloat)
130-
//将要开始刷新
131-
func willBeginRefreshing()
132-
//将要结束刷新,result是刷新的结果,对应着界面header将要隐藏
133-
func willEndRefreshing(result:RefreshResult)
134-
//已经结束刷新,result是刷新的结果,对应着界面header完全隐藏
135-
func didEndRefreshing(result:RefreshResult)
127+
128+
//百分比回调,在这里你根据百分比来动态的调整你的刷新视图
129+
func percentUpdateWhenNotRefreshing(percent:CGFloat)
130+
131+
//松手就会刷新的回调,在这个回调里,将视图切换到动画的状态
132+
func releaseWithRefreshingState()
133+
134+
//刷新结束,将要进行隐藏的动画,一般在这里告诉用户刷新的结果
135+
func didBeginEndRefershingAnimation(result:RefreshResult)
136+
137+
//刷新结束,隐藏的动画结束,一般在这里把视图隐藏,各个参数恢复到最初状态
138+
func didCompleteEndRefershingAnimation(result:RefreshResult)
139+
136140
```
137141

138142

Source/Classes/Header.swift

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class DefaultRefreshHeader:UIView,RefreshableHeader{
3030
addSubview(spinner)
3131
addSubview(textLabel)
3232
addSubview(imageView);
33-
let image = UIImage(named: "arrow_down", inBundle: NSBundle(forClass: self.dynamicType), compatibleWithTraitCollection: nil)
33+
let image = UIImage(named: "arrow_down", inBundle: NSBundle(forClass: DefaultRefreshHeader.self), compatibleWithTraitCollection: nil)
3434
imageView.image = image
3535
imageView.sizeToFit()
3636
imageView.frame = CGRectMake(0, 0, 24, 24)
@@ -60,7 +60,8 @@ public class DefaultRefreshHeader:UIView,RefreshableHeader{
6060
public func distanceToRefresh() -> CGFloat {
6161
return PullToRefreshKitConst.defaultHeaderHeight
6262
}
63-
public func percentageChangedDuringDragging(percent:CGFloat){
63+
public func percentUpdateWhenNotRefreshing(percent:CGFloat){
64+
6465
self.hidden = !(percent > 0.0)
6566
if percent > 1.0{
6667
textLabel.text = textDic[.releaseToRefresh]
@@ -81,7 +82,11 @@ public class DefaultRefreshHeader:UIView,RefreshableHeader{
8182
})
8283
}
8384
}
84-
public func willEndRefreshing(result:RefreshResult) {
85+
86+
public func percentageChangedDuringReleaseing(percent:CGFloat){
87+
88+
}
89+
public func didBeginEndRefershingAnimation(result:RefreshResult) {
8590
spinner.stopAnimating()
8691
imageView.transform = CGAffineTransformIdentity
8792
imageView.hidden = false
@@ -96,19 +101,16 @@ public class DefaultRefreshHeader:UIView,RefreshableHeader{
96101
textLabel.text = textDic[.pullToRefresh]
97102
}
98103
}
99-
public func didEndRefreshing(result:RefreshResult) {
104+
public func didCompleteEndRefershingAnimation(result:RefreshResult) {
100105
textLabel.text = textDic[.pullToRefresh]
101106
self.hidden = true
102107
}
103-
public func willBeginRefreshing() {
108+
public func releaseWithRefreshingState() {
104109
self.hidden = false
105110
textLabel.text = textDic[.refreshing]
106111
spinner.startAnimating()
107112
imageView.hidden = true
108113
}
109-
public func didBeginRefreshing() {
110-
111-
}
112114
}
113115

114116
public class RefreshHeaderContainer:UIView{
@@ -147,7 +149,7 @@ public class RefreshHeaderContainer:UIView{
147149
self.attachedScrollView.contentInset = oldInset
148150

149151
}, completion: { (finished) in
150-
self.delegate?.didEndRefreshing(self.currentResult)
152+
self.delegate?.didCompleteEndRefershingAnimation(self.currentResult)
151153
})
152154
case .Refreshing:
153155
dispatch_async(dispatch_get_main_queue(), {
@@ -158,9 +160,10 @@ public class RefreshHeaderContainer:UIView{
158160
self.attachedScrollView.contentInset = oldInset
159161
self.attachedScrollView.contentOffset = CGPointMake(0, -1.0 * top)
160162
}, completion: { (finsihed) in
161-
self.delegate?.didBeginRefreshing()
162163
self.refreshAction?()
163164
})
165+
self.delegate?.percentUpdateWhenNotRefreshing(1.0)
166+
self.delegate?.releaseWithRefreshingState()
164167
})
165168
default:
166169
break
@@ -210,7 +213,7 @@ public class RefreshHeaderContainer:UIView{
210213
}
211214
func handleScrollOffSetChange(change: [String : AnyObject]?){
212215
if state == .Refreshing {
213-
//Refre from here https://github.com/CoderMJLee/MJRefresh/blob/master/MJRefresh/Base/MJRefreshHeader.m, thanks to this lib again
216+
//Refer from here https://github.com/CoderMJLee/MJRefresh/blob/master/MJRefresh/Base/MJRefreshHeader.m, thanks to this lib again
214217
guard self.window != nil else{
215218
return
216219
}
@@ -231,16 +234,27 @@ public class RefreshHeaderContainer:UIView{
231234
return
232235
}
233236
let normal2pullingOffsetY = topShowOffsetY - self.frame.size.height
234-
let percent = (topShowOffsetY - offSetY)/self.frame.size.height
235237
if attachedScrollView.dragging {
236238
if state == .Idle && offSetY < normal2pullingOffsetY {
237239
self.state = .Pulling
238240
}else if state == .Pulling && offSetY >= normal2pullingOffsetY{
239241
state = .Idle
240242
}
241-
self.delegate?.percentageChangedDuringDragging(percent)
242243
}else if state == .Pulling{
243244
beginRefreshing()
245+
return
246+
}
247+
let percent = (topShowOffsetY - offSetY)/self.frame.size.height
248+
//防止在结束刷新的时候,percent的跳跃
249+
if let oldOffset = change?[NSKeyValueChangeOldKey]?.CGPointValue(){
250+
let oldPercent = (topShowOffsetY - oldOffset.y)/self.frame.size.height
251+
if oldPercent >= 1.0 && percent == 0.0{
252+
return
253+
}else{
254+
self.delegate?.percentUpdateWhenNotRefreshing(percent)
255+
}
256+
}else{
257+
self.delegate?.percentUpdateWhenNotRefreshing(percent)
244258
}
245259
}
246260
// MARK: - KVO -
@@ -254,7 +268,6 @@ public class RefreshHeaderContainer:UIView{
254268
}
255269
// MARK: - API -
256270
func beginRefreshing(){
257-
self.delegate?.willBeginRefreshing()
258271
if self.window != nil {
259272
self.state = .Refreshing
260273
}else{
@@ -264,7 +277,7 @@ public class RefreshHeaderContainer:UIView{
264277
}
265278
}
266279
func endRefreshing(result:RefreshResult){
267-
self.delegate?.willEndRefreshing(result)
280+
self.delegate?.didBeginEndRefershingAnimation(result)
268281
self.state = .Idle
269282
}
270283
}

Source/Classes/Left.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public enum RefreshKitLeftRightText{
1313
case scrollToAction
1414
case releaseToAction
1515
}
16+
1617
public class DefaultRefreshLeft:UIView,RefreshableLeftRight{
1718
public let imageView:UIImageView = UIImageView()
1819
public let textLabel:UILabel = UILabel().SetUp {
@@ -37,7 +38,7 @@ public class DefaultRefreshLeft:UIView,RefreshableLeftRight{
3738
textLabel.numberOfLines = 0
3839
imageView.frame = CGRectMake(0, 0,20, 20)
3940
imageView.center = CGPointMake(40,frame.size.height/2)
40-
let image = UIImage(named: "arrow_right", inBundle: NSBundle(forClass: self.dynamicType), compatibleWithTraitCollection: nil)
41+
let image = UIImage(named: "arrow_right", inBundle: NSBundle(forClass: DefaultRefreshLeft.self), compatibleWithTraitCollection: nil)
4142
imageView.image = image
4243
textDic[.scrollToAction] = PullToRefreshKitLeftString.scrollToAction
4344
textDic[.releaseToAction] = PullToRefreshKitLeftString.releaseToAction
@@ -51,7 +52,7 @@ public class DefaultRefreshLeft:UIView,RefreshableLeftRight{
5152
public func distanceToRefresh() -> CGFloat {
5253
return PullToRefreshKitConst.defaultHeaderHeight
5354
}
54-
public func percentageChangedDuringDragging(percent:CGFloat){
55+
public func percentUpdateWhenNotRefreshing(percent:CGFloat){
5556
if percent > 1.0{
5657
guard CGAffineTransformEqualToTransform(self.imageView.transform, CGAffineTransformIdentity) else{
5758
return
@@ -74,7 +75,7 @@ public class DefaultRefreshLeft:UIView,RefreshableLeftRight{
7475
public func didBeginRefreshing() {
7576

7677
}
77-
public func didEndRefreshing() {
78+
public func didCompleteEndRefershingAnimation() {
7879
textLabel.text = textDic[.scrollToAction]
7980
}
8081
}
@@ -106,7 +107,7 @@ class RefreshLeftContainer:UIView{
106107
self.delegate?.didBeginRefreshing()
107108
self.refreshAction?()
108109
self.endRefreshing()
109-
self.delegate?.didEndRefreshing()
110+
self.delegate?.didCompleteEndRefershingAnimation()
110111
})
111112
default:
112113
break
@@ -164,7 +165,7 @@ class RefreshLeftContainer:UIView{
164165
let normal2pullingOffsetX = topShowOffsetX - self.frame.size.width
165166
let percent = (topShowOffsetX - offSetX)/self.frame.size.width
166167
if attachedScrollView.dragging {
167-
self.delegate?.percentageChangedDuringDragging(percent)
168+
self.delegate?.percentUpdateWhenNotRefreshing(percent)
168169
if state == .Idle && offSetX < normal2pullingOffsetX {
169170
self.state = .Pulling
170171
}else if state == .Pulling && offSetX >= normal2pullingOffsetX{

0 commit comments

Comments
 (0)