@@ -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