2015-01-08 3 views
0

Я пытаюсь оживить представление в мигающий карет (как в текстовом редакторе). I не хотите, чтобы каретка интерполировалась; Я использую непрозрачность, чтобы показать/скрыть курсор, и я хочу, чтобы он шел прямо от 1.0 до 0.0. Вот то, что я до сих пор:CAKeyframeAnimation for blinking caret

CAKeyframeAnimation* blinkAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; 
blinkAnimation.values = @[ @(1.0), @(0.0) ]; 
blinkAnimation.keyTimes = @[ @0.0, @0.5 ]; 
blinkAnimation.duration = 1.0; 
blinkAnimation.calculationMode = kCAAnimationDiscrete; 
blinkAnimation.repeatCount = HUGE_VALF; 
blinkAnimation.removedOnCompletion = NO; 

По какой-то странной причине, каретка обращается в полной непрозрачности, и никогда не обращается в нуль непрозрачности. Однако, если я перехожу от blinkAnimation.calculationMode = kCAAnimationDiscrete в blinkAnimation.calculationMode = kCAAnimationLinear, то карет анимирует! Что происходит?!

ответ

1

Если значение расчетного режима установлено в kCAAnimationDiscrete, первое значение в массиве должно быть 0.0, а последнее значение должно быть 1.0. Массив должен иметь еще одну запись, чем в массиве значений. Например, если есть два значения, должно быть три ключевых раза.

CAKeyframeAnimation* blinkAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; 
blinkAnimation.values = @[ @(1.0), @(0.0), @(1.0)]; 
blinkAnimation.keyTimes = @[ @0.0, @0.5, @1.0]; 
blinkAnimation.duration = 1.0; 
blinkAnimation.calculationMode = kCAAnimationDiscrete; 
blinkAnimation.repeatCount = HUGE_VALF; 
blinkAnimation.removedOnCompletion = NO;