我有一个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()
}
......
}
答案 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)
我也遇到了这样的问题。您可以在下面使用这种方法:
像这样更改您的 handleRefresh 方法:
@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()
}
最后,您需要实现 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()使动画变得少平滑。因此,在用户释放拖动后,我就做到了。