Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours705

répondre à tous(2)je répondrai

  • PHP中文网

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

    Je vais vous donner deux idées. Elles ne sont peut-être pas les meilleures, mais j'espère qu'elles vous seront utiles. Tout d'abord, sleep(5) est écrit dans le thread principal, donc le chrysanthème a effectivement commencé à s'animer, mais lorsque sleep(5) est exécuté, le thread principal se met en veille et le runloop ne reçoit pas d'événements tactiles et ne se met pas à jour. l'interface utilisateur, vous ne pouvez donc pas voir l'effet d'animation du chrysanthème. Lorsque le thread principal est réveillé après 5 secondes, stopAnimating est directement exécuté, puis la nouvelle image est affichée. Vous pouvez utiliser l'afterAPI fourni par 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")
    }
    

    Si vous souhaitez quand même continuer à utiliser sleep, vous pouvez créer un sous-thread, mais c'est plus gênant :

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

    répondre
    0
  • 巴扎黑

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

    Intuition, il y a quelque chose qui ne va pas avec le sommeil(5).
    le mode veille entraînera l'arrêt des opérations de traitement par le processeur. De cette façon, lorsqu'elle est activée, l'interface utilisateur ne peut pas être mise à jour et rien ne se passe.

    Utilisez dispatch_after() pour remplacer sleep() afin de gérer les retards.

    répondre
    0
  • Annulerrépondre