我有一个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()
}
......
}
loadData()
是异步的吗?因为如果是这样它应该有一个完成处理程序和
tableView.reloadData()
refreshControl.endRefreshing()
应该从那里完成(在主线程上)。否则发生的事情是用户下拉并立即更新tableView并停止刷新控件,这就是为什么你没有动画。
尝试
@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()
}
}
我也遇到过那种问题。您可以使用以下方法:
@objc func handleRefresh(_ refreshControl: UIRefreshControl) {
if !tableView.isDragging {
refresh() // refresh is another method for your reloading jobs
}
}
func refresh() {
self.refreshControl.endRefreshing()
self.tableView.reloadData()
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if refreshControl.isRefreshing == true {
refresh()
}
}
我刚刚通过这样做解决了这个问题:
@objc func handleRefresh(_ refreshControl: UIRefreshControl) {
refreshControl.endRefreshing()
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
loadData()
}
很简单。现在动画要好得多。 tableView.reloadData()位于loadData()内部,使得动画不太流畅。所以我在用户从拖动中释放后做到了。