Ich habe zwei Ansichten: A und B. A ist am oberen Rand des Bildschirms positioniert, B ist am unteren Rand des Bildschirms positioniert. Wenn der Benutzer einen Knopf drückt, animiert B aufwärts mit einer EaseInEaseOut Bezier-Kurve, bis er y = 0 erreicht. Während B auf dem Weg zu seinem Ziel ist, sollte es A nach oben drücken, wenn es auf A trifft. Mit anderen Worten Wenn B beim Übergang von unten nach oben eine bestimmte y-Koordinate (A's Ursprung + Höhe) passiert hat, sollte A bei B bleiben, so scheint es, dass B A nach oben drückt."Push" Animation in Objective-C
Was ich bisher versucht:
- Registrieren Sie ein Ziel + Selektor auf einen CADisplayLink unmittelbar nachdem der Benutzer die Taste gedrückt wird. Fordern Sie in diesem Selektor die Y-Koordinate von B an, indem Sie auf seine presentationLayer zugreifen und die y-Koordinate von A entsprechend anpassen. Diese Methode erweist sich jedoch als nicht genau genug: Der Rahmen von presentationLayer befindet sich hinter der aktuellen Position von B auf dem Bildschirm (wahrscheinlich, weil PresentationLayer die Position der animierenden Ansicht für die aktuelle Zeit neu berechnet, die länger als 1 Frame dauert). . Wenn ich die Animationsdauer von B verlängere, funktioniert diese Methode einwandfrei.
- Registrieren Sie einen Ziel + Selektor auf einen CADisplayLink, unmittelbar nachdem der Benutzer die Schaltfläche gedrückt hat. Berechnen Sie in diesem Selektor die aktuelle y-Koordinate von B, indem Sie die Bezier-Gleichung für x = verstrichene Zeit/Animationsdauer (die die zurückgelegte Quotiententfernung/Gesamtstrecke zurückgeben soll) lösen. Ich habe Apples Open Source UnitBezier.h dafür verwendet (http://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h). Die Ergebnisse sind jedoch nicht korrekt.
Irgendwelche Vorschläge, was ich als nächstes versuchen kann?
Brillante und äußerst einfache Lösung. Vielen Dank! – datwelk