2016-09-23 1 views
0

Ich bin neu in UIView Animationen & habe Probleme beim Verständnis der Ausführung dieser Logik. Ich habe ein ImageView erstellt, um ein Bild aufzunehmen, ich habe einen Tap Gesture Recognizer hinzugefügt und das UIImageView auf "User Interaction Enabled" gesetzt. & rufe eine IBAction für dieses TGR auf. Dann rufe ich die Funktion unten auf, wenn das Bild angetippt wird. Das Ziel ist es, das Bild mit einer federnden Bewegung, wie es gestanzt wurde, zu "knacken", um zurück zu den ursprünglichen Grenzen des Bildes zu springen, so dass Sie erneut schlagen können. Es funktioniert genau so, wie ich es möchte (obwohl ich normalerweise mit Duration auf 0,25 setze, setze ich es hier auf 10, um die Animation besser sehen zu können). Allerdings verstehe ich nicht wirklich, warum das funktioniert. Die letzte Zeile legt die Endgrenzen des Bildes glatt auf die ursprüngliche Begrenzungsgröße fest (was ich will), aber das tut es glatt, obwohl es nicht Teil des Animationsblocks in der Schließung ist. Wenn ich die letzte Zeile eliminiere, die die Grenzen für das Bild zurücksetzt, wird das Bild nach jeder Ausführung um 60 Pixel in jeder Richtung wachsen (was ich erwarten würde). Was ich nicht verstehe, ist: Warum funktioniert die letzte Zeile in der Funktion, self.imageToPunch.bounds = Grenzen, reibungslos und scheinbar in Verbindung mit dem Animationsblock, auch wenn sie nicht innerhalb dieser Schließung ist?Unklar, warum UIView.animate reibungslos funktioniert, aber mit Code außerhalb des Animationsblocks

func animateImage() { 

    // Create a variable holding the bounds of the image 
    let bounds = self.imageToPunch.bounds 

    // Setup and execute the animation 
    UIView.animate(withDuration: 10.00, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: { 
     self.imageToPunch.bounds = CGRect(x: bounds.origin.x - 60, y: bounds.origin.y - 60, width: bounds.size.width + 60, height: bounds.size.height + 60) 

     }, completion: nil) 

    // Reset the bounds of button so it doesn't grow (remember we spring 60 pixels from the corners) 
    // self.imageToPunch.bounds = bounds 
    self.imageToPunch.bounds = bounds 
} 
+0

ja das ist seltsam, ich denke, wenn die Animation den nächsten Wert beginnt ist im Stapel abgelegt, so dass die Animation denkt, dass sie auch den nächsten beenden muss. Nun, ich bin mir nicht sicher. Wenn Sie Ihren Code verstehen möchten, sollten Sie eine neue UIView.animate mit Verzögerung Ihrer ersten Animation schreiben und sie zurück ändern. Es ist sicherer und wird in jeder Situation funktionieren. –

Antwort

0

Danke für den Rat, Björn. Ich bin mir nicht sicher, ob ich der von Ihnen vorgeschlagenen Implementierung folge, aber es hat mich dazu gebracht, etwas anderes zu versuchen. Indem Sie die ursprünglichen Bildansichtsgrenzen verkleinern und dann animieren, um zur ursprünglichen Größe zurückzukehren, scheint dies den gleichen Effekt zu erzielen. Code ist unten, aber ich würde immer noch gerne wissen, warum der ursprüngliche Code durch die Linie außerhalb der UIView.animate Aussage beeinflusst wurde:

// We'll use new constant bounds to hold the end state for the animation (imageToPunch's original bounds, or size rectangle) 
    let bounds = self.imageToPunch.bounds 

    // shrink imageToPunch by 60 
    self.imageToPunch.bounds = CGRect(x: self.imageToPunch.bounds.origin.x + 60, y: self.imageToPunch.bounds.origin.y + 60, width: self.imageToPunch.bounds.size.width - 60, height: self.imageToPunch.bounds.size.height - 60) 

    // animate image view out to the original size (saved in bounds) using a spring effect 
    UIView.animate(withDuration: 0.25, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: { 
     self.imageToPunch.bounds = bounds }, completion: nil) 
Verwandte Themen