【问题标题】:UIRefreshControl was functioning but not animatingUIRefreshControl 正常运行但没有动画
【发布时间】:2020-10-02 18:33:54
【问题描述】:

我有一个 UIRefreshControl,它工作得非常好,它在向下滚动时调用该函数,但问题是它没有动画,而且我的代码中没有任何问题,还有其他方法可以吗?没看到导致这个问题?

这是我现在得到的结果

正如你在 GIF 中看到的,UIRefreshControl 上没有动画但仍然调用该函数,

现在这是我的代码

import UIKit

class DummyTableViewController: UITableViewController {
    
    var arr: [Int] = [1,2,3]
    var refresher: UIRefreshControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        refresher = UIRefreshControl()
        refresher.attributedTitle = nil
        refresher.backgroundColor = .clear
        refresher.tintColor = .black
        refresher.addTarget(self, action: #selector(populate), for: .valueChanged)
        tableView.addSubview(refresher)
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return arr.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
        cell.textLabel?.text = String(arr[indexPath.row])

        // Configure the cell...

        return cell
    }
    
    @objc func populate() {
        for i in 1...1000 {
            arr.append(i)
        }
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.refresher.endRefreshing()
            self.tableView.reloadData()
        }
    }
}

我应该如何知道导致此问题的原因以及如何解决?

PS。我编辑了我的代码和 gif 结果,似乎答案和 cmets 对我的第一个代码感到困惑,所以我在结束刷新之前放了一个延迟。

【问题讨论】:

  • populate 应该几乎立即完成,并且您正在结束函数中的刷新。
  • @BallpointBen 我编辑了 gif 结果和代码,我在 endRefreshing 之前添加了延迟请检查

标签: ios swift uirefreshcontrol


【解决方案1】:

load 没有任何内容。假设您将从数据库中提取数据,这需要一些时间。当refreshing 需要几秒钟,你会看到圆圈动画。但在你的情况下,真的没有什么可以加载的。你只需用简单的integers 填充它,不需要足够的时间,所以refreshControl 实际上必须是animate

【讨论】:

  • 我做了@Frankenstein 的答案,但我仍然得到相同的结果
  • 你为什么首先想要那个动画?如果您可以立即填充tableView,为什么还要让用户等待?
  • 我编辑了gif结果和代码,我在endRefreshing之前添加了延迟,请检查
  • 尝试将 for 循环放在 Dispatch-function 中
【解决方案2】:

您没有看到动画,因为endRefreshing 方法被立即调用。要查看动画,您可以延迟一些时间。方法如下:

@objc func populate() {
    for i in 1...1000 {
        arr.append(i)
    }
    DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
        self.refresher.endRefreshing()
        self.tableView.reloadData()
    }
}

【讨论】:

  • 我只是得到相同的结果,但加载时间要长得多,它在半加载时停止,但没有动画。
  • 正如我在其他应用程序上看到的那样,我认为它在向下滚动滚动视图时应该仍然是动画,即使该函数还没有被调用......
  • 我编辑了gif结果和代码,我在endRefreshing之前添加了延迟请检查
【解决方案3】:

您应该延迟一些时间,如果您愿意,可以在下面使用滚动视图的扩展。所以你的代码将是:

import UIKit

class DummyTableViewController: UITableViewController {
    
    var arr: [Int] = [1,2,3]
    private lazy var refresher = UIRefreshControl()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        refresher = UIRefreshControl()
        refresher.attributedTitle = nil
        refresher.backgroundColor = .clear
        refresher.tintColor = .black
        refresher.addTarget(self, action: #selector(populate), for: .valueChanged)
        tableView.refreshControl = refreshControl
        tableView.addSubview(refresher)
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return arr.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
        cell.textLabel?.text = String(arr[indexPath.row])

        // Configure the cell...

        return cell
    }
    
    @objc func populate() {
        for i in 1...1000 {
            arr.append(i)
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
            self.refresher.endRefreshing()
            self.tableView.reloadData()
        }
        
    }
}


extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < 0 {
            topConstraint.constant = -scrollView.contentOffset.y/2
        } else {
            topConstraint.constant = 0
        }
    }
}

【讨论】:

  • 我编辑了gif结果和代码,我在endRefreshing之前添加了延迟请检查
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多