UIRefreshControl:表格视图奇怪地跳跃

Posted

技术标签:

【中文标题】UIRefreshControl:表格视图奇怪地跳跃【英文标题】:UIRefreshControl: table view jumps weirdly 【发布时间】:2020-11-30 22:30:26 【问题描述】:

我在一个table view里面有个UIRefreshControl,我的问题是当我拉下table view的时候,有某个点刷新控件的大小变化不是动画的,而是突然跳到一个大小到另一个。

我在一个简单的示例中重新创建了该行为,这是我的视图控制器中的所有代码:

class ViewController: UIViewController 
    
    let refreshControl = UIRefreshControl()
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        
        refreshControl.backgroundColor = .blue
        tableView.refreshControl = refreshControl
        tableView.insertSubview(refreshControl, at: 0)
    


extension ViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 20
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "testCell", for: indexPath)
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) 
        refreshControl.endRefreshing()
    

在以下视频中,您可以看到大小变化的动画效果很流畅,除了开始跳跃的某个点:

【问题讨论】:

您能否尝试删除此行:tableView.insertSubview(refreshControl, at: 0)tableView.refreshControl = refreshControl 应该已经将 refreshControl 添加为子视图,因此看起来您正在做多余的工作,并且还尝试对子视图的顺序进行硬编码,而不是依赖内置行为。 您好,感谢您的建议。不幸的是,删除该行后行为是相同的。 【参考方案1】:

你可以像这样快速地做到这一点:

var refreshControl = UIRefreshControl()

override func viewDidLoad() 
  super.viewDidLoad()

  tableView.delegate = self
  tableView.dataSource = self

  refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
  refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
  tableView.addSubview(refreshControl) // not required when using UITableViewController


@objc func refresh(_ sender: AnyObject) 
   // Code to refresh table view  
   refreshControl.endRefreshing() // End Refreshing

您不能在scrollViewDidEndDecelerating 方法中结束Refreshing() 并像上面一样更新您的viewDidLoad()

【讨论】:

谢谢,但这不起作用。我在哪里调用 endRefreshing() 并不重要,因为如果您检查我的问题中的视频,跳转发生在控件仍在刷新时,我正在拉表视图。 谢谢,删除以下行:tableView.refreshControl = refreshControl,并仅将其添加为子视图确实是修复!我想知道为什么会出现这种情况,因为在大多数教程和在线资源中,建议的方法都可以做到。

以上是关于UIRefreshControl:表格视图奇怪地跳跃的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIRefreshControl 在单视图应用程序中,没有表

类似于 UIRefreshControl 将隐藏的 UIView 添加到 UITableView

与单元格一起移动的 TableView 上的 UIRefreshControl

拖动时删除 UITableView 和 UIRefreshControl 之间的空白

当 UIRefreshControl 处于活动状态时,字母滚动条会向下移动?

NSFetchResultsController,将新数据填充到表格视图中