Как синхронно анимировать UIView и CALayer

Чтобы проиллюстрировать этот вопрос, я привел очень маленький проект Xcode на Github (два класса, загрузка 11 КБ). Ознакомьтесь с сутью здесьили используйте git clone (скрытый).


Рассмотрим следующий сценарий. Мое пользовательское представление, называемое 'контейнерным представлением', содержит два маленьких квадрата. На этом снимке экрана показано:

Screenshot of the initial position of the two squares

Синий квадрат — это экземпляр UIViewразмером 22x22 pt , а красный квадрат — экземпляр CALayer22x22 pt . Для целей этого вопроса я хочу, чтобы два квадрата «приклеивались» к правому нижнему углу внешнего вида, пока я анимирую рамку этого внешнего вида.

Я изменяю фрейм представления контейнера в методе класса UIViewanimateWithDuration:delay:options:animations:completion:с параметром замедления не по умолчанию типа UIViewAnimationCurveEaseOut.

[UIView animateWithDuration:1.0 delay:0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{ _containerView.frame = randomFrame; } 
                 completion:nil];

Примечание:И синий UIView, и красный кадр CALayer устанавливаются в переопределенном setFrame:методе представления контейнера, но результаты были бы такими же, если бы я установил синий UIView свойство autoresizingMaskдля гибкого левого и верхнего полей UIView.

В получившейся анимации синий квадрат «прилипает» к углу именно так, как я и предполагал, но красный квадрат полностью игнорирует как синхронизацию, так и замедление анимации.Я предполагаю, что это из-за неявной функции анимации Core Animation, функции, которая помогала мне во многих случаях раньше.

Вот несколько скриншотов в анимационной последовательности, которые иллюстрируют асинхронность двух квадратов:

Three screenshots mid-animation where the red square is not in the 'right' place

К вопросу: Есть ли способ синхронизировать два изменения кадров, чтобы красный CALayer и синий Оба UIView движутся с одинаковой продолжительностью анимации и кривой плавности, прилипая друг к другу, как если бы они были одним видом?

П.С. Конечно, требуемый визуальный результат двух слипшихся квадратов может быть достигнут любым количеством способов, например, если оба слоя станут либо CALayer, либо UIView, но проект что реальная проблема заключается в том, что у одного есть очень законная причина быть CALayer, а другой - UIView.

21
задан epologee 29 May 2012 в 14:43
поделиться