2016-04-02 25 views
1

Die mittlere Sperre wird in der Animation schneller nach oben animiert als der obere Bereich. Wie animiere ich die mittlere Sperre so, dass sie sich neben der oberen Scheibe nach oben bewegt? Um genauer zu sein, möchte ich, dass die mittlere Schlossmitte immer mit der oberen Fensterscheibe ausgerichtet ist, wenn sie sich nach oben und vom Bildschirm weg bewegt.So animieren Sie die Ansicht basierend auf einer anderen Ansicht

Dies ist der Code, den ich zur Zeit habe, lockBorder und lockKeyhole ist das, was als „Mittelsperre“ bezeichnet wird, die nach oben zu schnell im Vergleich zum topLock bewegt:

@IBOutlet var topLock: UIImageView! 
@IBOutlet var bottomLock: UIImageView! 
@IBOutlet var lockBorder: UIImageView! 
@IBOutlet var lockKeyhole: UIImageView! 


override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    openLock() 

} 


func openLock() { 

    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: { 
     self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(3.14)) 
     }, completion: { _ in 

      UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: { 

       var topFrame = self.topLock.frame 
       topFrame.origin.y -= topFrame.size.height 

       var bottomFrame = self.bottomLock.frame 
       bottomFrame.origin.y += bottomFrame.size.height 


       var lockBorderFrame = self.lockBorder.frame 
       lockBorderFrame.origin.y -= self.view.frame.height 

       var lockKeyholeFrame = self.lockKeyhole.frame 
       lockKeyholeFrame.origin.y -= self.view.frame.height 

       self.topLock.frame = topFrame 
       self.bottomLock.frame = bottomFrame 
       self.lockKeyhole.frame = lockKeyholeFrame 
       self.lockBorder.frame = lockBorderFrame 

       }, completion: { finished in 

      }) 
     }) 
} 
+0

Warum machst du es nicht nur eine Unteransicht der oberen Hälfte? – jtbandes

+0

@jtbandes Können Sie zeigen, wie Sie das tun würden? Momentan habe ich alles im Storyboard. – JEL

+0

Es ist schwer für mich zu verstehen, wie es aufgebaut ist, wenn man nur den Code betrachtet. Was ich empfehle, ist, dass 'topLock' und' lockKeyhole'/'lockBorder' Geschwisteransichten sind, sollten sie Unteransichten von' topLock' sein. Dann kannst du 'topLock' einfach verschieben und die anderen nehmen. – jtbandes

Antwort

0

Sie passen topFrame.origin.y von topFrame.size.height, aber Sie passen lockBorderFrame.origin.y und lockKeyholeFrame.origin.y von self.view.frame.height. Wir können daraus ableiten, dass diese Anpassungen unterschiedliche Beträge sind. Ich nehme an, topFrame.size.height ist eine Hälfte von self.view.size.height. Da Sie die Schlossansichten um den doppelten Abstand bewegen, den Sie bewegen, topLock, und beide Anpassungen über denselben Zeitraum von 0,6 Sekunden erfolgen, bewegen sich die Sperransichten doppelt so schnell.

Ich nehme an, Sie möchten die Schlossansichten vollständig aus dem Bildschirm animieren, so dass es nicht ausreichen würde, sie um nur topFrame.size.height zu verschieben. Das würde die untere Hälfte des Schlosses sichtbar lassen. Sie müssen die Sperransichten so verschieben, dass sich ihre unteren Kanten an der oberen Kante von self.view befinden.

Dies bedeutet, dass Sie lockBorder.frame.origin.y auf das Negative lockBorder.frame.size.height setzen müssen. Es bewegt sich eine Gesamtstrecke von lockBorder.frame.size.height + lockBorder.frame.origin.y, was gleich lockBorder.frame.maxY ist.

Ich gehe davon aus, dass lockBorder mindestens so groß wie lockKeyhole ist, also, wenn wir alle Ansichten von lockBorder.frame.maxY bewegen, werden sie alle aus dem Bildschirm sein. Und da wir sie alle um dieselbe Entfernung bewegen, werden sich alle Ansichten zusammen bewegen.

Beachten Sie auch, dass wenn Sie Einschränkungen in Ihrem Storyboard verwenden, diese Ansichten auf ihre ursprünglichen Positionen zurückspringen, sobald Sie fast alles andere zur Ansichtshierarchie machen. Daher sollten Sie sie wahrscheinlich aus ihren Superviews entfernen, sobald die Animation abgeschlossen ist, es sei denn, Sie verstecken sie auf andere Weise (z. B. durch Entfernen ihres Superview aus der Ansichtshierarchie).

Übrigens definiert die Standardbibliothek M_PI für Sie.

func openLock() { 
    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: { 
     self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)) 
     }, completion: { _ in 
      UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: { 
       let yDelta = self.lockBorder.frame.maxY 

       self.topLock.center.y -= yDelta 
       self.lockKeyhole.center.y -= yDelta 
       self.lockBorder.center.y -= yDelta 
       self.bottomLock.center.y += yDelta 
       }, completion: { _ in 
        self.topLock.removeFromSuperview() 
        self.lockKeyhole.removeFromSuperview() 
        self.lockBorder.removeFromSuperview() 
        self.bottomLock.removeFromSuperview() 
      }) 
    }) 
} 
+0

Es funktioniert, danke! Schnelle Frage: Normalerweise bekomme ich die Animationen zum Laufen, aber manchmal verstehe ich es falsch, wenn es um Mathe und Code geht. Gibt es also ein visuelles Tool, das dabei hilft? Wie PaintCode beim Zeichnen hilft, hilft da irgendwas? – JEL

+0

Ich kenne solch ein Werkzeug nicht. –

+0

Kein Problem, danke für die Antwort und für eine so großartige Erklärung der Antwort, die Sie zur Verfügung gestellt haben! – JEL

Verwandte Themen