2014-09-02 9 views
9

ich den Abschluss Schließung auf dieser UIView Animation erwartet nach der angegebenen Dauer genannt werden, aber es sofort Brennen zu sein scheint ...Swift UIView animateWithDuration Fertigstellung genannt Schließung sofort

UIView.animateWithDuration(
     Double(0.2), 
     animations: { 
      self.frame = CGRectMake(0, -self.bounds.height, self.bounds.width, self.bounds.height) 
     }, 
     completion: { finished in 
      if(finished) { 
       self.removeFromSuperview() 
      } 
     } 
    ) 

Hat sonst noch jemand erfahren Dies? Ich habe gelesen, dass andere mehr Erfolg hatten, indem sie das Zentrum anstatt den Rahmen benutzten, um die Ansicht zu verschieben, aber ich hatte auch die gleichen Probleme mit dieser Methode.

+0

Wohin führen Sie diesen Code aus? – akashivskyy

+3

Stellen Sie sicher, dass sich der Rahmen * tatsächlich * ändert, da der Abschlussblock sofort aufgerufen wird, wenn keine Animation vorhanden ist. – akashivskyy

+0

In einer benutzerdefinierten UIView-Klasse. Ich animiere die Ansicht an Stelle in init(), dann wird der obige Code aufgerufen, wenn irgendwo ein Tap auftritt. Der Rahmen ändert sich definitiv auch ... –

Antwort

0

ich das am Ende durch Bewegen der Animation von hitTest() und in touchesBegan() im UIView

8

Für alle anderen, dass ein Problem mit diesem ist, die, wenn überhaupt, um die Animation zu unterbrechen, die Fertigstellung Schließung wird sofort gelöst genannt . In meinem Fall war dies auf eine leichte Überlappung mit einem modalen Übergang des View-Controllers zurückzuführen, von dem sich der benutzerdefinierte Abschnitt abwandte. Die Verwendung des delay Teils von UIView.animateWithDuration(0.3, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations:{} hatte keinen Effekt für mich. Ich benutzte GCD, um die Animation um einen Bruchteil einer Sekunde zu verzögern.

// To avoid overlapping with the modal transiton 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 

    // Animate the transition 
    UIView.animateWithDuration(0.3, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 

     // Animations 

     }, completion: { finished in 

     // remove the views 
     if finished {    
      blurView.removeFromSuperview() 
      snapshot.removeFromSuperview() 
     } 
    }) 
})