@@ -22,31 +22,17 @@ 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- open var shouldBeVisibleWhileScrolling : Bool = false {
26- willSet{
27- if shouldBeVisibleWhileScrolling {
28- sendRefreshViewToScrollView ( )
29- }
30- }
31- }
25+ open var shouldBeVisibleWhileScrolling : Bool = false
3226
3327 let refreshView : UIView
3428 var action : ( ( ) -> ( ) ) ?
3529
3630 weak var scrollView : UIScrollView ? {
3731 willSet {
38- if #available( iOS 11 . 0 , * ) {
39- scrollView? . removeAdjustedContentInsetsHandler ( forPosition: position)
40- }
4132 removeScrollViewObserving ( )
4233 }
4334 didSet {
4435 if let scrollView = scrollView {
45- if #available( iOS 11 . 0 , * ) {
46- scrollView. addAdjustedContentInsetsHandler ( forPosition: position) { [ weak self] ( adjustedInsets) in
47- self ? . scrollViewDefaultAdjustedInsets = adjustedInsets
48- }
49- }
5036 scrollViewDefaultInsets = scrollView. contentInset
5137 addScrollViewObserving ( )
5238 }
@@ -59,7 +45,6 @@ open class PullToRefresh: NSObject {
5945 // MARK: - ScrollView & Observing
6046
6147 fileprivate var scrollViewDefaultInsets : UIEdgeInsets = . zero
62- fileprivate var scrollViewDefaultAdjustedInsets : UIEdgeInsets = . zero
6348 fileprivate var previousScrollViewOffset : CGPoint = CGPoint . zero
6449
6550 // MARK: - State
@@ -135,25 +120,21 @@ extension PullToRefresh {
135120 override open func observeValue( forKeyPath keyPath: String ? , of object: Any ? , change: [ NSKeyValueChangeKey : Any ] ? , context: UnsafeMutableRawPointer ? ) {
136121 if ( context == & KVO. context && keyPath == KVO . ScrollViewPath. contentOffset && object as? UIScrollView == scrollView) {
137122 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- }
144123 switch position {
145124 case . top:
146- offset = previousScrollViewOffset. y + topInsetY
125+ offset = previousScrollViewOffset. y + scrollViewDefaultInsets . top
147126
148127 case . bottom:
149128 if scrollView!. contentSize. height > scrollView!. bounds. height {
150- offset = scrollView!. contentSize. height - previousScrollViewOffset. y - scrollView!. bounds. height + topInsetY
129+ offset = scrollView!. contentSize. height - previousScrollViewOffset. y - scrollView!. bounds. height
151130 } else {
152- offset = scrollView!. contentSize. height - previousScrollViewOffset. y + topInsetY
131+ offset = scrollView!. contentSize. height - previousScrollViewOffset. y
132+ }
133+ if #available( iOS 11 , * ) {
134+ offset += scrollView!. safeAreaInsets. top
153135 }
154136 }
155137 let refreshViewHeight = refreshView. frame. size. height
156-
157138 switch offset {
158139 case 0 where ( state != . loading) : state = . initial
159140 case - refreshViewHeight... 0 where ( state != . loading && state != . finished) :
@@ -178,7 +159,7 @@ extension PullToRefresh {
178159 } else {
179160 super. observeValue ( forKeyPath: keyPath, of: object, change: change, context: context)
180161 }
181- previousScrollViewOffset. y = scrollView? . contentOffset . y ?? 0
162+ previousScrollViewOffset. y = scrollView? . normalizedContentOffset . y ?? 0
182163 }
183164
184165 fileprivate func addScrollViewObserving( ) {
@@ -211,24 +192,21 @@ extension PullToRefresh {
211192extension PullToRefresh {
212193
213194 func startRefreshing( ) {
214- if self . state != . initial {
195+ guard state == . initial, let scrollView = scrollView else {
215196 return
216197 }
217-
218198 var offsetY : CGFloat
219199 switch position {
220200 case . top:
221201 offsetY = - refreshView . frame . height - scrollViewDefaultInsets. top
222-
202+ if #available( iOS 11 , * ) {
203+ offsetY -= scrollView. safeAreaInsets. top
204+ }
223205 case . bottom:
224- offsetY = scrollView!. contentSize. height + refreshView. frame. height + scrollViewDefaultInsets. bottom - scrollView!. bounds. height
225- }
226-
227- scrollView? . setContentOffset ( CGPoint ( x: 0 , y: offsetY) , animated: true )
228- let delayTime = DispatchTime . now ( ) + Double( Int64 ( 0.27 * Double( NSEC_PER_SEC) ) ) / Double( NSEC_PER_SEC)
229- DispatchQueue . main. asyncAfter ( deadline: delayTime) { [ weak self] in
230- self ? . state = . loading
206+ offsetY = scrollView. contentSize. height + refreshView. frame. height + scrollViewDefaultInsets. bottom - scrollView. bounds. height
231207 }
208+ state = . loading
209+ scrollView. setContentOffset ( CGPoint ( x: 0 , y: offsetY) , animated: true )
232210 }
233211
234212 func endRefreshing( ) {
@@ -253,14 +231,12 @@ private extension PullToRefresh {
253231 animations: {
254232 switch self . position {
255233 case . top:
256- let insets = self . refreshView. frame. height + self . scrollViewDefaultInsets. top
257- scrollView. contentInset. top = insets
258- let offsetY = self . defaultInsets. top + self . refreshView. frame. height
259- scrollView. contentOffset = CGPoint ( x: scrollView. contentOffset. x, y: - offsetY)
260-
234+ let insetY = self . refreshView. frame. height + self . scrollViewDefaultInsets. top
235+ scrollView. contentInset. top = insetY
236+ scrollView. contentOffset = CGPoint ( x: scrollView. contentOffset. x, y: - insetY)
261237 case . bottom:
262- let insets = self . refreshView. frame. height + self . scrollViewDefaultInsets. bottom
263- scrollView. contentInset. bottom = insets
238+ let insetY = self . refreshView. frame. height + self . scrollViewDefaultInsets. bottom
239+ scrollView. contentInset. bottom = insetY
264240 }
265241 } ,
266242 completion: { _ in
@@ -284,9 +260,6 @@ private extension PullToRefresh {
284260 options: animationOptions,
285261 animations: {
286262 self . scrollView? . contentInset = self . scrollViewDefaultInsets
287- if case . top = self . position {
288- self . scrollView? . contentOffset. y = - self . defaultInsets. top
289- }
290263 } ,
291264 completion: { _ in
292265 self . addScrollViewObserving ( )
@@ -299,18 +272,10 @@ private extension PullToRefresh {
299272// MARK: - Helpers
300273private extension PullToRefresh {
301274
302- var defaultInsets : UIEdgeInsets {
303- if #available( iOS 11 , * ) {
304- return scrollViewDefaultAdjustedInsets
305- } else {
306- return scrollViewDefaultInsets
307- }
308- }
309-
310275 var isCurrentlyVisible : Bool {
311276 guard let scrollView = scrollView else { return false }
312277
313- return scrollView. contentOffset . y <= - defaultInsets . top
278+ return scrollView. normalizedContentOffset . y <= - scrollViewDefaultInsets . top
314279 }
315280
316281 func bringRefreshViewToSuperview( ) {
@@ -331,4 +296,3 @@ private extension PullToRefresh {
331296 }
332297
333298}
334-
0 commit comments