swift - 如何在ios程序开发中正确使用activity indicator(菊花等待图标)?
高洛峰
高洛峰 2017-04-18 09:42:22
0
2
696

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

图片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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
Ty80

Saya akan memberi anda dua idea. Ia mungkin bukan yang terbaik, tetapi saya harap ia berguna untuk anda. Pertama sekali, sleep(5) ditulis dalam utas utama, jadi kekwa sebenarnya telah mula bernyawa, tetapi apabila sleep(5) dilaksanakan, utas utama tidur, dan runloop tidak menerima peristiwa sentuhan dan tidak mengemas kini antara muka UI, jadi Anda tidak dapat melihat kesan animasi kekwa Apabila benang utama dibangkitkan selepas 5 saat, stopAnimating dilaksanakan secara langsung, dan kemudian gambar baharu dipaparkan. Anda boleh menggunakan afterAPI yang disediakan oleh GCD:

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

Jika anda masih mahu terus menggunakan tidur, anda boleh membuat sub-benang, tetapi ia lebih menyusahkan:

DispatchQueue.global().async {
    DispatchQueue.main.async {
        imageView.image = nil
        activityIndicator.startAnimating()
    }
    sleep(5)
    DispatchQueue.main.async {
        activityIndicator.stopAnimating()
        imageView.image = UIImage(named: "cat")
    }
}
巴扎黑

Intuisi, ada sesuatu yang tidak kena dengan tidur(5).
tidur akan menyebabkan CPU menghentikan operasi pemprosesan. Dengan cara ini, apabila ia didayakan, UI tidak boleh dikemas kini dan tiada apa yang berlaku.

Gunakan dispatch_after() untuk menggantikan sleep() untuk menangani kelewatan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!