Перемещение CALayer с позицией, а не со значениями?

Это хороший способ использовать позицию для постоянного перемещения CALayer? Мне действительно нужна анимация туда и обратно?

serveBlock2 = [CALayer layer];
serveBlock2.zPosition = 1;
[serveBlock2 setFrame:CGRectMake(screenBounds.size.height/2, 0, screenBounds.size.height/2, screenBounds.size.width)];
[serveBlock2 setOpacity:0.0f];
[serveBlock2 setBackgroundColor:[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.8f].CGColor];
[self.view.layer addSublayer:serveBlock2];

CABasicAnimation *updateCurrentServe2 = [CABasicAnimation animationWithKeyPath:@"position.y"];
serveBlock2.position = CGPointMake((screenBounds.size.height/4)*3, -screenBounds.size.width/2);
[updateCurrentServe2 setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.8 :-0.8 :1.0 :1.0]];
[updateCurrentServe2 setDuration:1.5];
[serveBlock2 addAnimation:updateCurrentServe2 forKey:@"serveBlock2 updateCurrentServe2"];

person Troy R    schedule 22.01.2014    source источник
comment
Это вообще работает? (Вы видите неявную анимацию или на самом деле видите 1,5-секундную анимацию?)   -  person David Rönnqvist    schedule 23.01.2014
comment
@DavidRönnqvist Я вижу 1,5-секундную анимацию. Я просто не знаю, хороший ли это способ сделать мою анимацию CALayer.   -  person Troy R    schedule 23.01.2014


Ответы (2)


У вас есть два вопроса, и я отвечу на них в обратном порядке:

Мне действительно нужна анимация туда и обратно?

Нет, вам это не нужно.

CABasicAnimation имеет три свойства, которые вместе определяют, как выполняется интерполяция, это fromValue, byValue и toValue. Их можно комбинировать различными способами, которые перечислены в разделе «Установка значений интерполяции» в документацию CABasicAnimation. Самая последняя перечисленная комбинация:

  • Все свойства nil. Интерполирует между предыдущим значением keyPath в уровне представления целевого уровня и текущим значением keyPath в уровне представления целевого уровня.

Итак, то, что вы делаете, и результаты, которые вы видите, — это задокументированное поведение и работа.

Это хороший способ использовать позицию для постоянного перемещения CALayer?

Это очень самоуверенный вопрос, и я могу только высказать вам свое личное мнение и попытаться объяснить свои рассуждения.

Мне лично это не нравится, потому что это менее явно, и вам нужно было бы прочитать этот особый случай в документации, чтобы узнать, как это работает. Как вы видели в комментарии к вашему вопросу, я даже не был уверен, как это работает, когда впервые увидел это, и я считаю себя хорошо знакомым с Core Animation и много раз читал документацию.

Все должно сводиться к тому, что вы и ваша команда считаете наиболее читаемым и понятным.

Лично я предпочитаю явно устанавливать новое значение модели, а затем указывать только fromValue, т.е. этот случай:

  • fromValue не является nil. Интерполирует между `fromValue и текущим значением представления свойства.
person David Rönnqvist    schedule 23.01.2014

Не понятно, что вы спрашиваете.

Базовая анимация на самом деле не меняет положение слоев, которые она анимирует. Это создает видимость того, что слой изменяется (путем внесения изменений в слой представления слоя), но на самом деле не изменяет базовое свойство. Обычно вы запускаете анимацию, а затем добавляете дополнительные операторы, чтобы установить свойство/свойства, которые вы изменяете, в их конечные значения. Затем, когда анимация завершается, объект оказывается в своем конечном местоположении.

Когда вы создаете CAAnimation, вы можете указать значение from и to или только значение to. Если вы укажете только значение to, оно будет анимировано из предыдущей позиции в новую позицию.

Если вы просто хотите переместить свой слой, установите его свойство position без анимации.

Если слой является фоновым слоем представления, он просто переместится на новое место.

Если слой является другим подслоем, вы получите неявную анимацию от старого значения к новому значению.

person Duncan C    schedule 22.01.2014