Swift 4 Refresh Control не плавный, но всегда прыгает - PullRequest
0 голосов
/ 28 марта 2019

У меня есть UIViewController, внутри которого есть tableView.Я добавил RefreshControl.Но когда я тяну, он всегда несколько раз прыгает, что вовсе не плавно и не непрерывно.

Я использую Swift 4 и Xcode 10.1.

class ItemsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextViewDelegate, ItemCellDelegate {
    ......
    lazy var refreshControl: UIRefreshControl = {
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action:
            #selector(handleRefresh(_:)),
                                 for: UIControl.Event.valueChanged)
        refreshControl.tintColor = UIColor.lightGray

        return refreshControl
    }()
    ......
    override func viewDidLoad() {
        // Refresh
        self.tableView.refreshControl = self.refreshControl
    }
    ......
    @objc func handleRefresh(_ refreshControl: UIRefreshControl) {
        loadData()
        self.tableView.reloadData()
        refreshControl.endRefreshing()
    }
    ......
}

Ответы [ 4 ]

0 голосов
/ 28 марта 2019

Я только что решил эту проблему, выполнив это:

@objc func handleRefresh(_ refreshControl: UIRefreshControl) {

    refreshControl.endRefreshing()
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {

    loadData()
}

Довольно просто.Теперь анимация намного лучше.TableView.reloadData (), которая находится внутри loadData (), обеспечивает плавную анимацию меньше .Поэтому я делаю это после того, как пользователь освобождается от перетаскивания.

0 голосов
/ 28 марта 2019

1001 * попробовать *

@objc func handleRefresh(_ refreshControl: UIRefreshControl) {
    loadData()
    self.tableView.reloadData()
    DispatchQueue.main.async {
    //DispatchQueue.main.asyncAfter(deadline: .now + 0.2) { // or this one with 
    //short delay
       refreshControl.endRefreshing()
    }
}
0 голосов
/ 28 марта 2019

Я тоже столкнулся с такой проблемой. Вы можете использовать этот подход ниже:

  1. Измените свой handleRefresh метод следующим образом:

    @objc func handleRefresh(_ refreshControl: UIRefreshControl) {
       if !tableView.isDragging {
        refresh() // refresh is another method for your reloading jobs
       }
    
    }
    
  2. Добавить метод обновления .

    func refresh() {
      self.refreshControl.endRefreshing()
      self.tableView.reloadData()
    }
    
  3. Наконец, вам нужно реализовать scrollViewDidEndDragging . Если вы остановились достаточно далеко, refreshControl будет обновляться, поэтому вызовите refresh. В противном случае вы либо не ушли достаточно далеко, либо перетаскивали на другую часть таблицы, либо перетаскивали настолько быстро, что событие refreshControl ValueChanged еще не сработало, и оно обновит таблицу там.

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
       if refreshControl.isRefreshing == true {
        refresh()
       }
     }
    
0 голосов
/ 28 марта 2019

Является ли loadData() асинхронным? потому что если это так, он должен иметь обработчик завершения и

tableView.reloadData()
refreshControl.endRefreshing()

должно быть сделано (в главном потоке) оттуда. В противном случае пользователь отключается, и вы мгновенно обновляете tableView и останавливаете элемент управления обновлением, поэтому у вас нет анимации.

...