How Do I Shorten the Pull Distance to Activate the Pull to Refresh Action in iOS 6/7?

霸气de小男生 提交于 2019-12-03 06:29:50

you can still use refreshControl but with some modifications!

add these code to your viewController:

var canRefresh = true

override func scrollViewDidScroll(scrollView: UIScrollView) {

    if scrollView.contentOffset.y < -100 { //change 100 to whatever you want

        if canRefresh && !self.refreshControl.refreshing {

            self.canRefresh = false
            self.refreshControl.beginRefreshing()

            self.refresh() // your viewController refresh function
        }
    }else if scrollView.contentOffset.y >= 0 { 

        self.canRefresh = true
    }
}

and as usual in the end of your refresh logic in self.refresh() function add :

   self.refreshControl.endRefreshing()

As per the Apple Docs, I don't see any way to modify UIRefreshControl parameters.
link: https://developer.apple.com/library/ios/documentation/uikit/reference/UIRefreshControl_class/Reference/Reference.html

Use a third-party component like ODRefreshControl (to customize the scroll-distance in order to activate the refresh, modify the #define kMaxDistance constant).

or...

Don't use the UIRefreshControl and instead implement your own logic in the -scrollViewDidScroll method like:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
        //refresh logic
    }
}

you can make it right with some modification

lazy var refreshControl: UIRefreshControl = {
        let refreshControl = UIRefreshControl()
        refreshControl.tintColor = UIColor.red
        return refreshControl
    }()

//refreshControl.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)

every PullToRefresh must have couple lines of code like this, that handleRefresh function, do whatever you need to refresh the page.

you just need to comment out addTarget line and add this function to your code ```

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < -80 { //change 80 to whatever you want
            if  !self.refreshControl.isRefreshing {
                handleRefresh()
            }
        }
    }

I wrote this code with the help of Ashkan Ghodrat's answer

For Swift 3.2 and above :

var canRefresh = true

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y < -100 {
        if canRefresh && !self.refreshControl.isRefreshing {
            self.canRefresh = false
            self.refreshControl.beginRefreshing()
            self.handleRefresh()
        }
    } else if scrollView.contentOffset.y >= 0 {
        self.canRefresh = true
    }
}

One line code

The value for that is _snappingHeight and you can set it to what ever you need like:

refreshControl.setValue(100, forKey: "_snappingHeight")
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!