Swift 4刷新控制不顺畅但总是跳跃

问题描述 投票:0回答:4

我有一个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()
    }
    ......
}
ios swift uitableview uirefreshcontrol
4个回答
0
投票

loadData()是异步的吗?因为如果是这样它应该有一个完成处理程序和

tableView.reloadData()
refreshControl.endRefreshing()

应该从那里完成(在主线程上)。否则发生的事情是用户下拉并立即更新tableView并停止刷新控件,这就是为什么你没有动画。


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

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会刷新,所以调用刷新。否则,您要么没有拉得足够远,要么拖动表的另一部分,要么拖得太快以至于还没有触发refreshControl ValueChanged事件,它将刷新那里的表。 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if refreshControl.isRefreshing == true { refresh() } }

0
投票

我刚刚通过这样做解决了这个问题:

@objc func handleRefresh(_ refreshControl: UIRefreshControl) {

    refreshControl.endRefreshing()
}

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

    loadData()
}

很简单。现在动画要好得多。 tableView.reloadData()位于loadData()内部,使得动画不太流畅。所以我在用户从拖动中释放后做到了。

© www.soinside.com 2019 - 2024. All rights reserved.