Swift 4 Refresh Control不流畅但总是跳

时间:2019-03-28 16:39:51

标签: ios swift uitableview uirefreshcontrol

我有一个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 :(得分:0)

loadData()是否异步?因为如果是这样,它应该具有完成处理程序和

tableView.reloadData()
refreshControl.endRefreshing()

应该从那里开始(在主线程上)。否则发生的事情是用户下拉菜单,并且您立即更新了tableView并停止了刷新控件,因此这就是您没有动画的原因。

答案 1 :(得分:0)

尝试

@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()
    }
}

答案 2 :(得分:0)

我也遇到了这样的问题。您可以在下面使用这种方法:

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

答案 3 :(得分:0)

我只是通过以下方法解决了这个问题:

@objc func handleRefresh(_ refreshControl: UIRefreshControl) {

    refreshControl.endRefreshing()
}

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

    loadData()
}

非常简单。现在,动画要好得多。 位于loadData()内的tableView.reloadData()使动画变得平滑。因此,在用户释放拖动后,我就做到了。