Чтобы проиллюстрировать этот вопрос, я создал очень маленький проект Xcode в Github (два класса, загрузка 11kb). Посмотрите на суть здесь или используйте git clone git @gist.github.com: 93982af3b65d2151672e.git.
Пожалуйста, рассмотрите следующий сценарий. Пользовательский вид, называемый 'container view', содержит два маленьких квадрата. Иллюстрируется на этом снимке экрана:
Синий квадрат - это пример 22x22 pt UIView
, а красный квадрат - это 22x22 pt CALayer
. Для целей этого вопроса я хочу, чтобы два квадрата "приклеивались" к нижнему правому углу внешнего вида, в то время как я одушевляю рамку этого внешнего вида.
Я изменяю рамку представления контейнера в методе класса 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 flexible left и верхние поля.
В полученной анимации синий квадрат "прилипает" к углу так, как я его намеревался, но красный квадрат полностью игнорирует как синхронизацию, так и ослабление анимации. Я предполагаю, что это из-за неявной анимационной функции Core Animation, функции, которая помогала мне во многих случаях раньше.
Вот несколько скриншотов в анимационной последовательности, которые иллюстрируют асинхронность двух квадратов:
На вопрос: Есть ли способ синхронизировать два изменения кадров, чтобы красный CALayer и синий UIView двигались с той же продолжительностью анимации и кривой ослабления, придерживаясь друг друга, как если бы они были одним смотреть?
P.S. Разумеется, необходимый визуальный результат двух склеиваемых квадратов может быть достигнут любым количеством способов, например, если оба слоя станут либо CALayer
, либо UIView
s, но проект, в котором находится реальная проблема, имеет очень законной причиной того, что один из них является CALayer, а другой - UIView.