How to detect Scrollview bounce - iOS

Viewed 9945

I would like to implement "pull down to refresh" type effect on a UIScrollview. On detecting "top" bounce of the scrollview, the view should refresh some of the components. How can I detect the "top bounce" of UIScrollview? I tried the delegate "scrollViewWillBeginDragging" but did not work.

3 Answers

For the record, i'm detecting both bounces on Swift 4 using this category:

extension UIScrollView {
    var isBouncing: Bool {
        var isBouncing = false
        if contentOffset.y >= (contentSize.height - bounds.size.height) {
            // Bottom bounce
            isBouncing = true
        } else if contentOffset.y < contentInset.top {
            // Top bounce
            isBouncing = true
        }
        return isBouncing
    }
}

Things to consider

  • In this case i'm just checking top content inset, if you are going to use bottom inset some tweaking must be necessary
  • If your scroll view is direct child of viewcontroller's view and has top constraint to superview instead of top safe area margin this will not do the trick perfect, more tweaking will be necessary

Most answers incorrectly handle the case when you scroll down. The main thing here is to use adjustedContentInset.bottom which includes both safeAreaInset and contentInset. Then it works correctly on iPhones with and without a notch.

extension UIScrollView {
    var isBottomBouncing: Bool {
        contentOffset.y > max(0.0, contentSize.height - bounds.height + adjustedContentInset.bottom)
    }
}

It is a very precise calculation, so if you rely on it in scrollViewDidScroll you may also need to apply some threshold, because scrollViewDidScroll may not catch the moment when isBottomBouncing changes to false.

Related