Skip to content

Commit 462c6a9

Browse files
author
Sergey D
authored
Merge pull request #81 from Yalantis/feature/always_visible_PullToRefresh
iOS 10 UITableViewController fix
2 parents dd20ceb + d695e67 commit 462c6a9

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

PullToRefresh/PullToRefresh.swift

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ open class PullToRefresh: NSObject {
3737
willSet {
3838
if #available(iOS 11.0, *) {
3939
scrollView?.removeAdjustedContentInsetsHandler(forPosition: position)
40-
}
40+
}
4141
removeScrollViewObserving()
4242
}
4343
didSet {
@@ -63,7 +63,7 @@ open class PullToRefresh: NSObject {
6363
fileprivate var previousScrollViewOffset: CGPoint = CGPoint.zero
6464

6565
// MARK: - State
66-
66+
6767
open fileprivate(set) var state: State = .initial {
6868
willSet{
6969
switch newValue {
@@ -89,7 +89,7 @@ open class PullToRefresh: NSObject {
8989
scrollView?.contentInset = self.scrollViewDefaultInsets
9090
state = .initial
9191
}
92-
92+
9393
default: break
9494
}
9595
}
@@ -135,15 +135,21 @@ extension PullToRefresh {
135135
override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
136136
if (context == &KVO.context && keyPath == KVO.ScrollViewPath.contentOffset && object as? UIScrollView == scrollView) {
137137
var offset: CGFloat
138+
var topInsetY: CGFloat
139+
if #available(iOS 11, *) {
140+
topInsetY = scrollView!.adjustedContentInset.top
141+
} else {
142+
topInsetY = scrollView!.contentInset.top
143+
}
138144
switch position {
139145
case .top:
140-
offset = previousScrollViewOffset.y + defaultInsets.top
146+
offset = previousScrollViewOffset.y + topInsetY
141147

142148
case .bottom:
143149
if scrollView!.contentSize.height > scrollView!.bounds.height {
144-
offset = scrollView!.contentSize.height - previousScrollViewOffset.y - scrollView!.bounds.height
150+
offset = scrollView!.contentSize.height - previousScrollViewOffset.y - scrollView!.bounds.height + topInsetY
145151
} else {
146-
offset = scrollView!.contentSize.height - previousScrollViewOffset.y
152+
offset = scrollView!.contentSize.height - previousScrollViewOffset.y + topInsetY
147153
}
148154
}
149155
let refreshViewHeight = refreshView.frame.size.height
@@ -256,13 +262,13 @@ private extension PullToRefresh {
256262
let insets = self.refreshView.frame.height + self.scrollViewDefaultInsets.bottom
257263
scrollView.contentInset.bottom = insets
258264
}
259-
},
265+
},
260266
completion: { _ in
261267
scrollView.bounces = true
262268
if self.shouldBeVisibleWhileScrolling {
263269
self.bringRefreshViewToSuperview()
264270
}
265-
}
271+
}
266272
)
267273

268274
action?()
@@ -281,11 +287,11 @@ private extension PullToRefresh {
281287
if case .top = self.position {
282288
self.scrollView?.contentOffset.y = -self.defaultInsets.top
283289
}
284-
},
290+
},
285291
completion: { _ in
286292
self.addScrollViewObserving()
287293
self.state = .initial
288-
}
294+
}
289295
)
290296
}
291297
}
@@ -309,11 +315,11 @@ private extension PullToRefresh {
309315

310316
func bringRefreshViewToSuperview() {
311317
guard let scrollView = scrollView, let superView = scrollView.superview else { return }
312-
guard let scrollViewIndex = superView.subviews.index(of: scrollView) else { return }
313318
let frame = scrollView.convert(refreshView.frame, to: superView)
314319
refreshView.removeFromSuperview()
315-
superView.insertSubview(refreshView, at: scrollViewIndex + 1)
320+
superView.insertSubview(refreshView, aboveSubview: scrollView)
316321
refreshView.frame = frame
322+
refreshView.layoutSubviews()
317323
}
318324

319325
func sendRefreshViewToScrollView() {
@@ -325,3 +331,4 @@ private extension PullToRefresh {
325331
}
326332

327333
}
334+

0 commit comments

Comments
 (0)