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

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

图片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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(2)
Ty80

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")
    }
}
巴扎黑

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal