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ąguUIViewmetoda 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ę alboCALayers lubUIViews, ale projekt, w którym znajduje się prawdziwy problem, ma bardzo uzasadniony powód, aby ten był CALayer, a drugi UIView.

questionAnswers(2)

yourAnswerToTheQuestion