Rumah  >  Soal Jawab  >  teks badan

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

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

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

高洛峰高洛峰2716 hari yang lalu704

membalas semua(2)saya akan balas

  • PHP中文网

    PHP中文网2017-04-18 09:44:22

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

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:44:22

    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.

    balas
    0
  • Batalbalas