Чтобы проиллюстрировать этот вопрос, я разместил на Github очень небольшой проект Xcode (два класса, загрузка 11 КБ). Взгляните на суть здесь или используйте git clone [email protected]: 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, функции, которая раньше помогала мне во многих случаях.
Вот несколько снимков экрана в анимационной последовательности, которые иллюстрируют асинхронность двух квадратов: