Чтобы проиллюстрировать этот вопрос, я привел очень маленький проект Xcode на Github (два класса, загрузка 11 КБ). Ознакомьтесь с сутью здесьили используйте git clone (скрытый).
Рассмотрим следующий сценарий. Мое пользовательское представление, называемое 'контейнерным представлением', содержит два маленьких квадрата. На этом снимке экрана показано:
Синий квадрат — это экземпляр UIViewразмером 22x22 pt , а красный квадрат — экземпляр CALayer
22x22 pt . Для целей этого вопроса я хочу, чтобы два квадрата «приклеивались» к правому нижнему углу внешнего вида, пока я анимирую рамку этого внешнего вида.
Я изменяю фрейм представления контейнера в методе класса UIView
animateWithDuration: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, функции, которая помогала мне во многих случаях раньше.
Вот несколько скриншотов в анимационной последовательности, которые иллюстрируют асинхронность двух квадратов:
К вопросу: Есть ли способ синхронизировать два изменения кадров, чтобы красный CALayer и синий Оба UIView движутся с одинаковой продолжительностью анимации и кривой плавности, прилипая друг к другу, как если бы они были одним видом?
П.С. Конечно, требуемый визуальный результат двух слипшихся квадратов может быть достигнут любым количеством способов, например, если оба слоя станут либо CALayer
, либо UIView
, но проект что реальная проблема заключается в том, что у одного есть очень законная причина быть CALayer, а другой - UIView.