Skip to content

Commit dd20ceb

Browse files
author
Sergey D
authored
Merge pull request #80 from Yalantis/feature/always_visible_PullToRefresh
Added "shouldBeVisibleWhileScrolling" property to PullToRefresh
2 parents 16e36be + 8610a6c commit dd20ceb

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

PullToRefresh/PullToRefresh.swift

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@ open class PullToRefresh: NSObject {
2222
open var springDamping: CGFloat = 0.4
2323
open var initialSpringVelocity: CGFloat = 0.8
2424
open var animationOptions: UIViewAnimationOptions = [.curveLinear]
25-
25+
open var shouldBeVisibleWhileScrolling: Bool = false {
26+
willSet{
27+
if shouldBeVisibleWhileScrolling {
28+
sendRefreshViewToScrollView()
29+
}
30+
}
31+
}
32+
2633
let refreshView: UIView
2734
var action: (() -> ())?
2835

@@ -58,6 +65,15 @@ open class PullToRefresh: NSObject {
5865
// MARK: - State
5966

6067
open fileprivate(set) var state: State = .initial {
68+
willSet{
69+
switch newValue {
70+
case .finished:
71+
if shouldBeVisibleWhileScrolling {
72+
sendRefreshViewToScrollView()
73+
}
74+
default: break
75+
}
76+
}
6177
didSet {
6278
animator.animate(state)
6379
switch state {
@@ -243,6 +259,9 @@ private extension PullToRefresh {
243259
},
244260
completion: { _ in
245261
scrollView.bounces = true
262+
if self.shouldBeVisibleWhileScrolling {
263+
self.bringRefreshViewToSuperview()
264+
}
246265
}
247266
)
248267

@@ -287,4 +306,22 @@ private extension PullToRefresh {
287306

288307
return scrollView.contentOffset.y <= -defaultInsets.top
289308
}
309+
310+
func bringRefreshViewToSuperview() {
311+
guard let scrollView = scrollView, let superView = scrollView.superview else { return }
312+
guard let scrollViewIndex = superView.subviews.index(of: scrollView) else { return }
313+
let frame = scrollView.convert(refreshView.frame, to: superView)
314+
refreshView.removeFromSuperview()
315+
superView.insertSubview(refreshView, at: scrollViewIndex + 1)
316+
refreshView.frame = frame
317+
}
318+
319+
func sendRefreshViewToScrollView() {
320+
refreshView.removeFromSuperview()
321+
guard let scrollView = scrollView else { return }
322+
scrollView.addSubview(refreshView)
323+
refreshView.frame = scrollView.defaultFrame(forPullToRefresh: self)
324+
scrollView.sendSubview(toBack: refreshView)
325+
}
326+
290327
}

PullToRefresh/UIScrollView+PullToRefresh.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,28 +33,35 @@ public extension UIScrollView {
3333
}
3434
}
3535

36+
internal func defaultFrame(forPullToRefresh pullToRefresh: PullToRefresh) -> CGRect {
37+
let view = pullToRefresh.refreshView
38+
var originY: CGFloat
39+
switch pullToRefresh.position {
40+
case .top:
41+
originY = -view.frame.size.height
42+
case .bottom:
43+
originY = contentSize.height
44+
}
45+
return CGRect(x: 0, y: originY, width: frame.width, height: view.frame.height)
46+
}
47+
3648
public func addPullToRefresh(_ pullToRefresh: PullToRefresh, action: @escaping () -> ()) {
3749
pullToRefresh.scrollView = self
3850
pullToRefresh.action = action
3951

40-
var originY: CGFloat
4152
let view = pullToRefresh.refreshView
4253

4354
switch pullToRefresh.position {
4455
case .top:
4556
removePullToRefresh(at: .top)
46-
4757
topPullToRefresh = pullToRefresh
48-
originY = -view.frame.size.height
4958

5059
case .bottom:
5160
removePullToRefresh(at: .bottom)
52-
5361
bottomPullToRefresh = pullToRefresh
54-
originY = contentSize.height
5562
}
5663

57-
view.frame = CGRect(x: 0, y: originY, width: frame.width, height: view.frame.height)
64+
view.frame = defaultFrame(forPullToRefresh: pullToRefresh)
5865

5966
addSubview(view)
6067
sendSubview(toBack: view)

0 commit comments

Comments
 (0)