Aller au contenu


Photo

Executer du code de façon asynchrone


  • Please log in to reply
6 réponses à ce sujet

#1 Machaon

Machaon

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 31 messages

Posté 30 novembre 2017 - 22:03

Bonsoir à tous,

 

j'ai une vue tout simple avec 3 images. Sur chacune, je joue une petite animation simple up and down de 10px vers le haut. ça fonctionne.

Sauf que je voudrais que la deuxième image s'anime à la fin de la première et la troisième à la fin de deuxième, le code ci-dessous devrait s'exécuter pas à pas : image1 puis image2 puis image3.

En l'état les 3 images bougent ensemble. Que puis-je faire ? j'ai essayé des dispatch_queue en mode async, etc... mais en vain.

 

Merci pour votre aide.

    override func viewDidAppear(_ animated: Bool) {
        let hover = CABasicAnimation(keyPath: "position")
        
        hover.isAdditive = true
        hover.fromValue = NSValue(cgPoint: CGPoint.zero)
        hover.toValue = NSValue(cgPoint: CGPoint(x: 0.0, y: -10.0))
        hover.autoreverses = true
        hover.duration = 0.2
        hover.repeatCount = 1

        self.image1.layer.add(hover, forKey: "myHoverAnimation")
        self.image2.layer.add(hover, forKey: "myHoverAnimation")
        self.image3.layer.add(hover, forKey: "myHoverAnimation")

    }



#2 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 880 messages
  • LocationParis

Posté 30 novembre 2017 - 22:37

Pourquoi ne pas utiliser la complétion de fin de UIView.animate, pour déclencher les animations les unes après les autres ?

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var vue1: UIView!
    @IBOutlet weak var vue2: UIView!
    @IBOutlet weak var vue3: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let decalage:CGFloat = -50
        
        UIView.animate(withDuration: 0.5,
                       animations: { self.vue1.frame.origin.y += decalage },
                       completion: { _ in
        UIView.animate(withDuration: 0.5,
                       animations: { self.vue2.frame.origin.y += decalage },
                       completion: { _ in
        UIView.animate(withDuration: 0.5,
                       animations: { self.vue3.frame.origin.y += decalage })
        }) })
    }
}

Time Magazine a appelé pour dire que je serai PROBABLEMENT désigné « Dévelopeur de l’année », mais il fallait que je donne mon accord pour une interview et une séance de photos. J’ai dit que « probablement » n’était pas suffisant et j’ai décliné. Merci quand même!

 

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#3 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 384 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 01 décembre 2017 - 09:00

Je suis d'accord avec Draken. Si tu veux vraiment utiliser Core Animation, CATransaction a une propriété .completionBlock.


RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#4 Machaon

Machaon

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 31 messages

Posté 04 décembre 2017 - 20:51

Bonsoir, merci pour vos réponses.

En ce qui concerne les animations, je suis tombé sur ce tuto qui propose d'utiliser la notion de "delay" et cela correspond plus à ce que j'imaginais faire au final : insérer un léger décalage entre les animations.

 

https://www.raywende...tting-started-3

UIView.animate(withDuration: 0.5, delay: 0.3, options: [],
  animations: {
    self.username.center.x += self.view.bounds.width
  }, 
  completion: nil
)


#5 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 880 messages
  • LocationParis

Posté 04 décembre 2017 - 21:26

Absolument. J’y avais pensé, mais vu le titre du topic j’ai préféré te montrer une solution avec un vrai synchronisme du code.

 

L’utilisation d’un délai permet un synchronisme apparent des mouvements, mais ils sont complètements indépendants les uns des autres. Si tu te trompes dans un paramètre temporel, toute la chorégraphie est fichue.


Time Magazine a appelé pour dire que je serai PROBABLEMENT désigné « Dévelopeur de l’année », mais il fallait que je donne mon accord pour une interview et une séance de photos. J’ai dit que « probablement » n’était pas suffisant et j’ai décliné. Merci quand même!

 

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#6 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 880 messages
  • LocationParis

Posté 07 décembre 2017 - 02:26

 

Bonsoir, merci pour vos réponses.

En ce qui concerne les animations, je suis tombé sur ce tuto qui propose d'utiliser la notion de "delay" et cela correspond plus à ce que j'imaginais faire au final : insérer un léger décalage entre les animations.

 

https://www.raywende...tting-started-3

UIView.animate(withDuration: 0.5, delay: 0.3, options: [],
  animations: {
    self.username.center.x += self.view.bounds.width
  }, 
  completion: nil
)

a

En fait, tu n’as pas besoin d’employer une syntaxe aussi complexe. options: et completion: ont une valeur vide par défaut, ce qui évite d’avoir à les définir dans le code.

 

La syntaxe simplifiée est plus parlante, enfin à mes yeux :

        let anim = { self.vue1.frame.origin.y += decalage }        
        UIView.animate(withDuration: 0.5, delay: 0.3, animations: anim)

  • Machaon aime ceci

Time Magazine a appelé pour dire que je serai PROBABLEMENT désigné « Dévelopeur de l’année », mais il fallait que je donne mon accord pour une interview et une séance de photos. J’ai dit que « probablement » n’était pas suffisant et j’ai décliné. Merci quand même!

 

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#7 Machaon

Machaon

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 31 messages

Posté 09 décembre 2017 - 17:55

 

a

En fait, tu n’as pas besoin d’employer une syntaxe aussi complexe. options: et completion: ont une valeur vide par défaut, ce qui évite d’avoir à les définir dans le code.

 

La syntaxe simplifiée est plus parlante, enfin à mes yeux :

        let anim = { self.vue1.frame.origin.y += decalage }        
        UIView.animate(withDuration: 0.5, delay: 0.3, animations: anim)

J'ai compris. Merci Draken






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)