CAKeyframeAnimation путь для определения непрозрачности?

Можно ли использовать CAKeyframeAnimation с путем вместо значений ключевых кадров для анимации (не позиционных) свойств? Вот ключевой код:

CAKeyframeAnimation *theLeftGradientAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
theLeftGradientAnimation.removedOnCompletion = NO;
theLeftGradientAnimation.fillMode = kCAFillModeForwards;
theLeftGradientAnimation.duration = (isToClose ? self.fromDuration : self.toDuration);

//test with a linear monotonic path to define the opacity function response
UIBezierPath    *shadePath = [UIBezierPath bezierPath];
[shadePath moveToPoint:CGPointMake(0.0f, 0.0)];  //ASSUME coords are: x->t y->alpha(t)
[shadePath addLineToPoint:CGPointMake(1.0f, 1.0f)];  //ASSUME time normalized to duration
[shadePath closePath];

theLeftGradientAnimation.path = shadePath.CGPath;

Однако это не работает должным образом - непрозрачность анимируется плавно, хотя и не монотонно или точно в соответствии с изменениями в пути (предполагается, что путь «нормализован» от (0.0,0.0) до ( 1.0,1.0) как функция ослабления). Обратите внимание, что я не анимирую положение и не перемещаю слой по пути, но надеюсь использовать это для любого свойства, которое можно анимировать.

В документации есть некоторая двусмысленность, которая предполагает, что путь может использоваться таким образом для эффективного определения передаточной функции времени анимации в зависимости от анимируемого свойства (таким образом, заменяет массив значений ключевых кадров, которые будут созданы на основе этой передаточной функции) . Также в документации iOS 6 для «Keyframe Timing and Pacing Extensions» делается попытка прояснить использование пути по сравнению со значениями, но это все еще неоднозначно.


person Rich    schedule 24.11.2012    source источник


Ответы (1)


Обратите внимание, что CAKeyframeAnimation имеет свойство timingFunctions (множественное число) и игнорирует timingFunction. В вашем случае, поскольку вы хотите монотонности, вы, вероятно, захотите установить theLeftGradientAnimation.timingFunction = kCAMediaTimingFunctionLinear. Функция timeFunction по умолчанию действительно выполняет нелинейную интерполяцию.

См. Документацию для более подробного описания функций тайминга и того, как предоставить свои собственные CAMediaTimingFunction, если встроенных не хватает.

person fzwo    schedule 24.11.2012
comment
Использование TimingFunction было бы излишним, если бы указание свойства пути работало так, как предполагалось (тоже безуспешно). Обратите внимание, что тестовый код определяет линейно-монотонную функцию только для определения того, как это может работать. В конечном итоге я хочу использовать сложную нелинейную функцию для анимации свойств таким образом (нет возможности настроить с помощью functionWithControlPoints ::: :). - person Rich; 24.11.2012
comment
Приношу свои извинения за неясность этого намерения. Использование функции timeFunctions (множественное число) также будет избыточным, поскольку ее необязательное использование уместно при указании значений ключевых кадров, а не пути. К сожалению, мало примеров кода CAKeyframeAnimation, не говоря уже о том, чтобы знать, допустимо ли это использование. - person Rich; 24.11.2012
comment
Читая документацию, мне кажется, что путь вообще не содержит компонента синхронизации, а просто эффективно действует как список равномерно распределенных значений. Я не знаю, как значение CGPoint будет преобразовано в скалярное значение, такое как альфа. На вашем месте я бы сначала попробовал использовать только values и keyTimes, экспериментируя, какой calculationMode работает лучше всего. Перечитывание документации для timingFunctions, timingFunction (в единственном числе) вообще не работает с CAKeyframeAnimation. Как вы соблюдаете свои ценности? - person fzwo; 24.11.2012
comment
Предположение (на самом деле предположение) состоит в том, что координата x соответствует t, а координата y - x (t) (свойство, которое нужно анимировать, например, альфа) - тогда это будет вести себя точно так же, как кривые kCAMediaTimingFunction. - person Rich; 24.11.2012
comment
Я тестирую только на симуляторе (вероятно, плохая идея), но я могу изменить две точки пути в приведенном выше коде, и это меняет альфа-анимацию (только не в том смысле, в котором это имеет смысл). Возможно, вы правы, и мне, возможно, придется вместо этого сгенерировать массивы для значений ключевых кадров, но подход непрерывного пути, похоже, стоил того. - person Rich; 24.11.2012