Jak synchronicznie animować UIView i CALayer
Aby zilustrować to pytanie, stworzyłem bardzo mały projekt Xcode na Github (dwie klasy, 11kb do pobrania).Spójrz na istotę tutaj albo użyjgit clone [email protected]: 93982af3b65d2151672e.git.
Proszę wziąć pod uwagę następujący scenariusz. Mój własny widok, zwany„widok kontenera”, zawiera dwa małe kwadraty. Zilustrowane na tym zrzucie ekranu:
Niebieski kwadrat to 22x22 ptUIView
przykład, a czerwony kwadrat to 22x22 ptCALayer
instancja. Na potrzeby tego pytania chcę, aby dwa kwadraty „przykleiły się” do prawego dolnego rogu widoku zewnętrznego, podczas gdy animuję ramkę tego zewnętrznego widoku.
Zmieniam ramkę widoku kontenera w ciąguUIView
metoda klasyanimateWithDuration:delay:options:animations:completion:
, z niedomyślnym parametrem luzowania typuUIViewAnimationCurveEaseOut
.
[UIView animateWithDuration:1.0 delay:0
options:UIViewAnimationCurveEaseOut
animations:^{ _containerView.frame = randomFrame; }
completion:nil];
Uwaga: Zarówno niebieska ramka UIView, jak i czerwona ramka CALayer są ustawione w przesłoniętymsetFrame:
metoda widoku kontenera, ale wyniki byłyby takie same, gdybym ustawił niebieski UIViewautoresizingMask
właściwość do UIView elastyczny lewy i górny margines.
W powstałej animacji niebieski kwadrat „przykleja się” do rogu tak, jak zamierzałem, ale czerwony kwadrat całkowicie ignoruje zarówno czas, jak i łagodzenie animacji. Zakładam, że wynika to z ukrytej funkcji animacji Core Animation, funkcji, która pomogła mi już wcześniej.
Oto kilka zrzutów ekranu w sekwencji animacji, które ilustrują asynchroniczność dwóch kwadratów:
Na pytanie:Czy istnieje sposób na zsynchronizowanie dwóch zmian ramek, tak aby czerwony CALayer i niebieski UIView poruszały się z tą samą długością krzywej animacji i krzywą dynamiki, przyklejając się do siebie, jakby były jednym widokiem?
P.S. Oczywiście wymagany efekt wizualny dwóch sklejających się ze sobą kwadratów można uzyskać na wiele sposobów, na przykład dzięki temu, że obie warstwy staną się alboCALayer
s lubUIView
s, ale projekt, w którym znajduje się prawdziwy problem, ma bardzo uzasadniony powód, aby ten był CALayer, a drugi UIView.