CALayer исчезает с текущего значения

Мое приложение использует 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)?

Удачи.

5
задан epologee 18 April 2012 в 21:56
поделиться