Мое приложение использует CALayer
для рисования представлений. Точнее, он использует метод drawLayer:inContext:
на подслое верхнего слоя UIView
. Это хороший способ получить «неявную» анимацию последовательных drawLayer:inContext:
рисунков, плавно переходящих друг в друга с течением времени. Анимация затухания происходит довольно быстро, может быть, за 0,25 секунды, но чтобы изменить ее продолжительность, просто реализуйте другой метод делегата с именем actionForLayer:forKey:
. В этом прекрасно работающем примере реализации длительность по умолчанию увеличена до 2,0 секунд:
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.duration = 2.0;
return animation;
// or return nil for the default duration.
}
Перейдем к рассматриваемой проблеме.
Если вы вызовете [sublayer setNeedsDisplay]
быстрее, чем успеют завершиться переходы, с каждым новым переходом вы увидите внезапный скачок. Судя по всему, текущее затухание отменяется, и его конечное состояние используется в качестве отправной точки нового затухания. Это может быть не очень удивительно, но визуальный результат довольно нежелательный.
Рассмотрим сценарий десятисекундного перехода от черного к белому с последующим переходом к черному через пять секунд после начала. Анимация начнет плавно переходить от черного к белому, но когда она становится «наполовину серой», она становится полностью белой, а затем снова становится черной.
Есть ли способ предотвратить это? Могу ли я заставить слой изменить цвет с серого на черный? Существует ли эквивалент рисования CALayer, говорящего UIViewAnimationOptionBeginFromCurrentState
(используется в анимации UIView)?
Удачи.