swift - 如何在ios程序开发中正确使用activity indicator(菊花等待图标)?

 奕殫的泪 发布于 2022-10-29 18:32

我想达到的效果是这样的:
点击按钮

图片ImageView处的占位图消失

图片处开始显示菊花动画图标

旋转五秒中

菊花图标停止并消失

显示新的图片

部分代码如下:

class ViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    @IBAction func clickButton(_ sender: UIButton) {
        imageView.image = nil
        activityIndicator.startAnimating()
        sleep(5)
        activityIndicator.stopAnimating()
        imageView.image = UIImage(named: "cat")
    }
}

页面设计

实际效果是点击按钮之后,什么都没有发生,五秒钟之后换成了新的图片。
请问正确的写法应该是怎样的?

我的全部源码在这里:https://github.com/Stanley-Ti...
编程环境是Xcode8 Swift3

2 个回答
  • 直觉,sleep(5)有问题。
    sleep会让CPU停止处理操作。这样,在它使能时,UI不能更新,也就什么都没有发生了。

    使用dispatch_after()来替换sleep()处理延迟。

    2022-10-31 18:15 回答
  • 给你提供两个思路吧,不一定是最好的,但愿对你有用吧。首先sleep(5)是写在主线程中,那么实际上菊花是已经开始动画了,不过当执行到sleep(5)的时候主线程休眠了,runloop不接收触控事件也不更新UI界面,所以你看不到菊花的动画效果,当主线程5秒后被唤醒,直接执行了stopAnimating,然后展示新图片。可以用GCD提供的afterAPI:

    imageView.image = nil
    activityIndicator.startAnimating()
    let delay = DispatchTime.now() + DispatchTimeInterval.seconds(5)
    DispatchQueue.main.asyncAfter(deadline: delay) {
            activityIndicator.stopAnimating()
            imageView.image = UIImage(named: "cat")
    }
    

    如果还想继续用sleep那可以开辟一个子线程,不过比较麻烦:

    DispatchQueue.global().async {
        DispatchQueue.main.async {
            imageView.image = nil
            activityIndicator.startAnimating()
        }
        sleep(5)
        DispatchQueue.main.async {
            activityIndicator.stopAnimating()
            imageView.image = UIImage(named: "cat")
        }
    }
    2022-10-31 18:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有