2017-05-01 2 views
-1

Ich möchte ein ImageView in meinem ViewController "pulsieren", dh größer und dann wieder kleiner werden und das wiederholen bis der "Start" -Button gedrückt wurde. Das Problem ist, dass jedes Mal, wenn ich diese Funktion in der viewDidLoad() mit einer Wiederholungsschleife aufruft, es aus irgendeinem Grund einen Haltepunkt hat.Wiederhole while-Schleife funktioniert nicht - warum?

Das ist der Teil meines viewDidLoad ist():

repeat { 
    pulsate() 
} while hasStarted == false 

Wenn ich die Start-Taste drücken, hasStarted wahr wird und es sollte pulsierende stoppen. Aber es startet nicht einmal die Funktion, es ruft sofort einen Fehler auf. Wo ist das Problem?

Hier ist meine pulsieren() - Funktion

func pulsate() 
{ 
    frameOR = imageView.frame 
    frameNext = CGRect(x: imageView.frame.midX - 35, y: imageView.frame.midY - 35, width: 80, height: 80) 
    let frameVDL = CGRect(x: imageView.frame.midX - 150, y: imageView.frame.midY - 150, width: 300, height: 300) 

    if start == false 
    { 
     UIView.animate(withDuration: 2, animations: { 
      self.imageView.frame = frameVDL 
     }) { (finished) in 
      UIView.animate(withDuration: 2, animations: { 
       self.imageView.frame = self.frameOR 
      }, completion: nil) 
     } 
    } 
} 

Vielen Dank für Ihre Hilfe! Ich wünsche ihnen einen wunderbaren Tag!

+2

Was ist der Fehler? –

+1

Sie blockieren den Hauptthread. Es wird keine Schaltfläche (oder eine andere) UI-Aktionsmethode ausgeführt, bevor die Programmsteuerung zur Hauptereignisschleife zurückkehrt. –

Antwort

3

Sie können die eingebauten Optionen UIView.animate verwenden, um wirklich zu vereinfachen, was Sie versuchen, und zu vermeiden, den Faden zu sperren.

Geben Sie diesen einen Versuch:

let frameOR = imageView.frame 
let frameVDL = CGRect(x: imageView.frame.midX - 150, y: imageView.frame.midY - 150, width: 300, height: 300) 

UIView.animate(withDuration: 2.0, 
       delay: 0.0, 
       options: [UIViewAnimationOptions.autoreverse, UIViewAnimationOptions.repeat], 
       animations: { 
       imageView.frame = frameVDL 
       }, 
       completion: nil) 

Ihr Imageview jetzt in einer voll „Pulsieren“ Schleife sein sollte, ohne zusätzlichen Code zu benötigen. Wenn Sie zu Stop die Animation bereit sind, rufen Sie einfach:

imageView.layer.removeAllAnimations()