Как сократить длину вытягивания, чтобы активировать Pull to Refresh Action в iOS 6/7?

Привет, люди StackOverflow,

Я пытался выяснить этот вопрос в течение некоторого времени, но безрезультатно, и мне нужна помощь. У меня есть UITableView ближе к нижней части моего приложения, и нет достаточного расстояния экрана, чтобы пользователь мог активировать обновление. Кто-нибудь знает, как я могу сократить расстояние, необходимое для активации действия pull для обновления (через UIRefreshControl в iOS 6/7) на UITableView и UIWebView?

Спасибо заранее всем!

Ответ 1

В соответствии с документами Apple, я не вижу способа изменить параметры UIRefreshControl.
ссылка: https://developer.apple.com/library/ios/documentation/uikit/reference/UIRefreshControl_class/Reference/Reference.html

Используйте сторонний компонент, например ODRefreshControl (чтобы настроить расстояние прокрутки, чтобы активировать обновление, измените #define kMaxDistance).

или...

Не используйте UIRefreshControl и вместо этого реализуйте свою собственную логику в методе -scrollViewDidScroll, например:

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

Ответ 2

вы все равно можете использовать refreshControl, но с некоторыми изменениями!

добавьте этот код в свой 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
    }
}

и, как обычно, в конце вашей логики обновления в функции self.refresh() add:

   self.refreshControl.endRefreshing()

Ответ 3

Вы можете сделать это правильно с некоторой модификацией

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

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

каждый PullToRefresh должен иметь несколько строк кода, подобных этой, функцию handleRefresh, делать все, что вам нужно для обновления страницы.

вам просто нужно закомментировать строку addTarget и добавить эту функцию в ваш код '' '

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

Я написал этот код с помощью ответа Ашкана Годрата.

Ответ 4

Для Swift 3.2 и выше:

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