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

Commit fd4f918

Browse files
完善Container逻辑,支持header额外区域配置,完善淘宝Demo
1 parent 14080fc commit fd4f918

11 files changed

Lines changed: 53 additions & 23 deletions

PullToRefreshKit.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
52BB29321D364E490091F36B /* DefaultTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BB29311D364E490091F36B /* DefaultTableViewController.swift */; };
3030
52BB29341D3655B90091F36B /* Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BB29331D3655B90091F36B /* Util.swift */; };
3131
52C0E4881D3726EB00618231 /* ConfigBannerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52C0E4871D3726EB00618231 /* ConfigBannerController.swift */; };
32+
52D61D701D3F56A900A5B4E0 /* taobaoLogo.png in Resources */ = {isa = PBXBuildFile; fileRef = 52D61D6F1D3F56A900A5B4E0 /* taobaoLogo.png */; };
3233
52E8FB401D336E26000D0BF1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E8FB3F1D336E26000D0BF1 /* AppDelegate.swift */; };
3334
52E8FB421D336E26000D0BF1 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E8FB411D336E26000D0BF1 /* MainViewController.swift */; };
3435
52E8FB451D336E26000D0BF1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 52E8FB431D336E26000D0BF1 /* Main.storyboard */; };
@@ -64,6 +65,7 @@
6465
52BB29311D364E490091F36B /* DefaultTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultTableViewController.swift; sourceTree = "<group>"; };
6566
52BB29331D3655B90091F36B /* Util.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Util.swift; sourceTree = "<group>"; };
6667
52C0E4871D3726EB00618231 /* ConfigBannerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigBannerController.swift; sourceTree = "<group>"; };
68+
52D61D6F1D3F56A900A5B4E0 /* taobaoLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = taobaoLogo.png; sourceTree = "<group>"; };
6769
52E8FB3C1D336E26000D0BF1 /* PullToRefreshKit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PullToRefreshKit.app; sourceTree = BUILT_PRODUCTS_DIR; };
6870
52E8FB3F1D336E26000D0BF1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
6971
52E8FB411D336E26000D0BF1 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
@@ -203,6 +205,7 @@
203205
52FA97A71D3888660021D77F /* taobao */ = {
204206
isa = PBXGroup;
205207
children = (
208+
52D61D6F1D3F56A900A5B4E0 /* taobaoLogo.png */,
206209
5238C7D21D37427C00B3B4FE /* TaoBaoRefreshHeader.swift */,
207210
5238C7D41D37449800B3B4FE /* TaobaoTableViewController.swift */,
208211
);
@@ -278,6 +281,7 @@
278281
buildActionMask = 2147483647;
279282
files = (
280283
5238C8091D3763CD00B3B4FE /* arrow_right@3x.png in Resources */,
284+
52D61D701D3F56A900A5B4E0 /* taobaoLogo.png in Resources */,
281285
52261F111D36878A00161ADF /* banner2.jpg in Resources */,
282286
52F50E391D3E3E3800A9AB83 /* PullToRefreshkit.strings in Resources */,
283287
5238C8071D3763CD00B3B4FE /* arrow_down@3x.png in Resources */,

PullToRefreshKit/ConfigBannerController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ConfigBannerController: UIViewController {
5454
label.frame = CGRectMake(0, 0, screenWidth, 40)
5555
label.font = UIFont.systemFontOfSize(14)
5656
label.center = CGPointMake(scrollView.center.x, scrollView.center.y - CGRectGetWidth(scrollView.frame)/2 - 20)
57-
label.text = "向左或者向右滑动Banner"
57+
label.text = "向左或向右滑动Banner"
5858
label.textAlignment = .Center
5959
}
6060
view.addSubview(desLabel)

PullToRefreshKit/DefaultBannerController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class DefaultBannerController: UIViewController {
4545
label.frame = CGRectMake(0, 0, screenWidth, 40)
4646
label.font = UIFont.systemFontOfSize(14)
4747
label.center = CGPointMake(scrollView.center.x, scrollView.center.y - CGRectGetWidth(scrollView.frame)/2 - 20)
48-
label.text = "向左或者向右滑动Banner"
48+
label.text = "向左或向右滑动Banner"
4949
label.textAlignment = .Center
5050
}
5151
view.addSubview(desLabel)

PullToRefreshKit/DianpingRefreshHeader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class DianpingRefreshHeader:UIView,RefreshableHeader{
4141
return UIImage(named:name)!
4242
}
4343
imageView.animationImages = images
44-
imageView.animationDuration = 0.6
44+
imageView.animationDuration = Double(images.count) * 0.15
4545
imageView.startAnimating()
4646
}
4747
//刷新结束,将要隐藏header

PullToRefreshKit/TaoBaoRefreshHeader.swift

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import Foundation
1010
import UIKit
1111

12+
1213
class TaoBaoRefreshHeader:UIView,RefreshableHeader{
1314
private let circleLayer = CAShapeLayer()
1415
private let arrowLayer = CAShapeLayer()
@@ -18,12 +19,20 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
1819
super.init(frame: frame)
1920
setUpCircleLayer()
2021
setUpArrowLayer()
21-
textLabel.frame = CGRectMake(CGRectGetWidth(self.bounds)/2 - 30, CGRectGetHeight(self.bounds)/2 - 20,120, 40)
22+
textLabel.frame = CGRectMake(0,0,120, 40)
2223
textLabel.textAlignment = .Center
2324
textLabel.textColor = UIColor.lightGrayColor()
2425
textLabel.font = UIFont.systemFontOfSize(14)
2526
textLabel.text = "下拉即可刷新..."
27+
let imageView = UIImageView(frame: CGRectMake(0, 0, 230, 35))
28+
imageView.image = UIImage(named: "taobaoLogo")
29+
self.addSubview(imageView)
2630
self.addSubview(textLabel)
31+
//放置Views和Layer
32+
imageView.center = CGPointMake(CGRectGetWidth(frame)/2, CGRectGetHeight(frame) - 60 - 18)
33+
textLabel.center = CGPointMake(CGRectGetWidth(frame)/2 + 20, CGRectGetHeight(frame) - 30)
34+
self.arrowLayer.position = CGPointMake(CGRectGetWidth(frame)/2 - 60, CGRectGetHeight(frame) - 30)
35+
self.circleLayer.position = CGPointMake(CGRectGetWidth(frame)/2 - 60, CGRectGetHeight(frame) - 30)
2736
}
2837
func setUpArrowLayer(){
2938
let bezierPath = UIBezierPath()
@@ -38,7 +47,6 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
3847
self.arrowLayer.lineWidth = 1.0
3948
self.arrowLayer.lineCap = kCALineCapRound
4049
self.arrowLayer.bounds = CGRectMake(0, 0,40, 40)
41-
self.arrowLayer.position = CGPointMake(CGRectGetWidth(self.bounds)/2.0 - 60, CGRectGetHeight(self.bounds)/2.0)
4250
self.arrowLayer.anchorPoint = CGPointMake(0.5, 0.5)
4351
self.layer.addSublayer(self.arrowLayer)
4452
}
@@ -56,7 +64,6 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
5664
self.circleLayer.lineWidth = 1.0
5765
self.circleLayer.lineCap = kCALineCapRound
5866
self.circleLayer.bounds = CGRectMake(0, 0,40, 40)
59-
self.circleLayer.position = CGPointMake(CGRectGetWidth(self.bounds)/2.0 - 60, CGRectGetHeight(self.bounds)/2.0)
6067
self.circleLayer.anchorPoint = CGPointMake(0.5, 0.5)
6168
self.layer.addSublayer(self.circleLayer)
6269
}
@@ -70,7 +77,9 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
7077
}
7178
func percentUpdateWhenNotRefreshing(percent:CGFloat){
7279
let adjustPercent = max(min(1.0, percent),0.0)
73-
self.circleLayer.strokeEnd = 0.05 + (0.95 - 0.05) * adjustPercent
80+
transitionWithOutAnimation {
81+
self.circleLayer.strokeEnd = 0.05 + (0.95 - 0.05) * adjustPercent
82+
};
7483
if adjustPercent == 1.0{
7584
textLabel.text = "释放即可刷新..."
7685
}else{
@@ -89,12 +98,22 @@ class TaoBaoRefreshHeader:UIView,RefreshableHeader{
8998
textLabel.text = "刷新中..."
9099
}
91100
func didBeginEndRefershingAnimation(result:RefreshResult){
92-
self.circleLayer.strokeEnd = 0.05
101+
transitionWithOutAnimation {
102+
self.circleLayer.strokeEnd = 0.05
103+
};
93104
self.circleLayer.removeAllAnimations()
94105
}
95106
func didCompleteEndRefershingAnimation(result:RefreshResult){
96-
self.circleLayer.strokeEnd = 0.05
107+
transitionWithOutAnimation {
108+
self.circleLayer.strokeEnd = 0.05
109+
};
97110
self.arrowLayer.hidden = false
98111
textLabel.text = "下拉即可刷新"
99112
}
113+
func transitionWithOutAnimation(clousre:()->()){
114+
CATransaction.begin()
115+
CATransaction.setDisableActions(true)
116+
clousre()
117+
CATransaction.commit()
118+
}
100119
}

PullToRefreshKit/TaobaoTableViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class TaobaoTableViewController:CustomBaseTableViewController{
1212
override func viewDidLoad() {
1313
super.viewDidLoad()
1414
//Setup
15-
self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0)
16-
let taobaoHeader = TaoBaoRefreshHeader(frame: CGRectMake(0,0,CGRectGetWidth(self.view.bounds),60))
15+
// self.tableView.backgroundColor = UIColor(red: 232.0/255.0, green: 234.0/255.0, blue: 235.0/255.0, alpha: 1.0)
16+
let taobaoHeader = TaoBaoRefreshHeader(frame: CGRectMake(0,0,CGRectGetWidth(self.view.bounds),100))
1717
self.tableView.setUpHeaderRefresh(taobaoHeader) { [weak self] in
1818
delay(1.5, closure: {
1919
self?.models = (self?.models.map({_ in random100()}))!

PullToRefreshKit/taobaoLogo.png

97.3 KB
Loading

Source/Classes/Const.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct PullToRefreshKitFooterString{
4343
static let refreshing = "正在加载中..."
4444
static let noMoreData = "数据加载完毕"
4545
static let tapToRefresh = "点击加载更多"
46-
static let scrollAndTapToRefresh = "上拉或者点击加载更多"
46+
static let scrollAndTapToRefresh = "上拉或点击加载更多"
4747
}
4848

4949
struct PullToRefreshKitLeftString{

Source/Classes/Footer.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,21 @@ public enum RefreshKitFooterText{
1818
}
1919

2020
public enum RefreshMode{
21+
/// 只有Scroll才会触发
2122
case Scroll
23+
/// 只有Tap才会触发
2224
case Tap
25+
/// Scroll和Tap都会触发
2326
case ScrollAndTap
2427
}
28+
2529
public class DefaultRefreshFooter:UIView,RefreshableFooter{
2630
public let spinner:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
2731
public let textLabel:UILabel = UILabel(frame: CGRectMake(0,0,140,40)).SetUp {
2832
$0.font = UIFont.systemFontOfSize(14)
2933
$0.textAlignment = .Center
3034
}
31-
/// 是否需要点击来触发刷新,如果需要点击,则在上拉的时候,不会触发刷新
35+
/// 触发刷新的模式
3236
public var refreshMode = RefreshMode.ScrollAndTap{
3337
didSet{
3438
tap.enabled = (refreshMode != .Scroll)

Source/Classes/Header.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,9 @@ public class RefreshHeaderContainer:UIView{
152152
})
153153
case .Refreshing:
154154
dispatch_async(dispatch_get_main_queue(), {
155+
let fireHeight = (self.delegate?.distanceToRefresh())!
155156
UIView.animateWithDuration(0.4, animations: {
156-
let top = (self.originalInset?.top)! + CGRectGetHeight(self.frame)
157+
let top = (self.originalInset?.top)! + fireHeight
157158
var oldInset = self.attachedScrollView.contentInset
158159
oldInset.top = top
159160
self.attachedScrollView.contentInset = oldInset
@@ -211,6 +212,7 @@ public class RefreshHeaderContainer:UIView{
211212
attachedScrollView?.removeObserver(self, forKeyPath: PullToRefreshKitConst.KPathOffSet,context: nil)
212213
}
213214
func handleScrollOffSetChange(change: [String : AnyObject]?){
215+
let fireHeight = (self.delegate?.distanceToRefresh())!
214216
if state == .Refreshing {
215217
//Refer from here https://github.com/CoderMJLee/MJRefresh/blob/master/MJRefresh/Base/MJRefreshHeader.m, thanks to this lib again
216218
guard self.window != nil else{
@@ -219,7 +221,7 @@ public class RefreshHeaderContainer:UIView{
219221
let offset = attachedScrollView.contentOffset
220222
let inset = originalInset!
221223
var insetT = -1 * offset.y > inset.top ? (-1 * offset.y):inset.top
222-
insetT = insetT > CGRectGetHeight(self.frame) + inset.top ? CGRectGetHeight(self.frame) + inset.top:insetT
224+
insetT = insetT > fireHeight + inset.top ? fireHeight + inset.top:insetT
223225
var oldInset = attachedScrollView.contentInset
224226
oldInset.top = insetT
225227
attachedScrollView.contentInset = oldInset
@@ -232,7 +234,7 @@ public class RefreshHeaderContainer:UIView{
232234
guard offSetY <= topShowOffsetY else{
233235
return
234236
}
235-
let normal2pullingOffsetY = topShowOffsetY - self.frame.size.height
237+
let normal2pullingOffsetY = topShowOffsetY - fireHeight
236238
if attachedScrollView.dragging {
237239
if state == .Idle && offSetY < normal2pullingOffsetY {
238240
self.state = .Pulling
@@ -243,10 +245,10 @@ public class RefreshHeaderContainer:UIView{
243245
beginRefreshing()
244246
return
245247
}
246-
let percent = (topShowOffsetY - offSetY)/self.frame.size.height
248+
let percent = (topShowOffsetY - offSetY)/fireHeight
247249
//防止在结束刷新的时候,percent的跳跃
248250
if let oldOffset = change?[NSKeyValueChangeOldKey]?.CGPointValue(){
249-
let oldPercent = (topShowOffsetY - oldOffset.y)/self.frame.size.height
251+
let oldPercent = (topShowOffsetY - oldOffset.y)/fireHeight
250252
if oldPercent >= 1.0 && percent == 0.0{
251253
return
252254
}else{

0 commit comments

Comments
 (0)