UIRefreshControl не исчезает после прокрутки табличного представления наверх программно - PullRequest
0 голосов
/ 01 февраля 2020

Когда я хочу обновить источник данных табличного представления, сначала я хочу прокрутить вверх (до представления заголовка), затем показать представление UIRefreshControl, после обновления источника данных затем я хочу скрыть UIRefreshControll.

Для этого я попробовал следующую строку:

self.kisilerTable.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: false)
self.kisilerTable.setContentOffset(CGPoint(x: 0, y: self.kisilerTable.contentOffset.y - (self.refreshControl.frame.size.height)), animated: true)
self.kisilerTable.refreshControl?.beginRefreshing()

Выше кода прокручивается вверх, затем он показывает UIRefreshControl. И после того, как мои данные обновились, я попытался скрыть их с помощью следующего кода:

self.kisilerTable.reloadData()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    self.kisilerTable.refreshControl?.endRefreshing()
}

Но проблема в том, что вышеупомянутый код скрывает анимацию индикатора, но оставляет там пробел. Как вы можете видеть на скриншоте:

enter image description here enter image description here

Если я пытаюсь скрыться с помощью следующего кода:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    self.kisilerTable.reloadData()
    self.kisilerTable.refreshControl?.endRefreshing()
}

Это скрывается, но я теряю анимацию скрытия. Я не хочу терять анимацию скрытия.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 02 февраля 2020

Я думаю, что это происходит, потому что в начале вы используете setContentOffset , чтобы оставить пробел, но этот пробел не удаляется.

Я предложу другую реализацию, которая работает очень хорошо:

Сначала вы объявляете refreshControll перед методом viewDidLoad () :

 let refreshControl = UIRefreshControl()

Теперь вам нужно создать метод для остановки анимации при необходимости:

func stopAnimatingRefreshControl() {
    if let refreshControl = 
       tableView.subviews.first(where: { $0 is UIRefreshControl})as? UIRefreshControl,
       refreshControl.isRefreshing {

        refreshControl.endRefreshing()
    }
}

Теперь вы создаете функцию @ obj c, которая вызывается при прокрутке таблицы для обновления, обычно в этот момент вы вызываете методы, которые заставляют ваш сервер запросить обновление данных.

Когда эти данные обновляются, вы вызываете функцию stopAnimatingRefreshControl ():

@objc func refreshMyData() {
    // call methods for get data from server
    getDataFromServer()
}

func getDataFromServer() {
   // request completed and data is updated, now i need stop the loading.

    DispatchQueue.main.async {
        self.tableView.reloadData()
    }

    stopAnimatingRefreshControl()
}

Наконец, после создания необходимых методов вам необходимо связать нашу @ obj c функцию до refreshControll и наш tableView , сделайте это методом viewDidLoad () :

refreshControl.addTarget(self, action: #selector(refreshMyData), for: .valueChanged)
tableView.addSubview(refreshControl)

Теперь все готово, я надеюсь, я помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...