微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UIRefreshControl起作用但没有动画

如何解决UIRefreshControl起作用但没有动画

我有一个UIRefreshControl确实很好用,它在向下滚动时会调用函数,但问题是它没有动画效果,我的代码没有发现任何问题,还有其他方法可以解决吗?我看不出会导致此问题吗?

这是我现在得到的结果

enter image description here

如您在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结果,似乎答案和注释在我的第一个代码上感到困惑,所以我在刷新之前花了点时间。

解决方法

load没什么可做的。假设您需要花费一些时间从数据库中提取数据。当refreshing时,需要花费几秒钟的时间,您会看到圆圈正在动画。但是在您的情况下,实际上没有什么可加载的。您只需使用简单的integers来填充它,这并不需要足够的时间,因此refreshControl实际上必须animate

,

您没有看到动画,因为endRefreshing方法被立即调用。要观看动画,您可以稍作延迟。方法如下:

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

您应该设置一些延迟,并且可以在下面使用扩展名来进行滚动查看。因此您的代码将是:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。