用于闪烁插入符号的 CAKeyframeAnimation

CAKeyframeAnimation for blinking caret

我正在尝试将视图动画化为闪烁的插入符号(就像在文本编辑器中一样)。我 不想 插入插入符;我对 show/hide 光标使用不透明度,我希望它直接从 1.0 变为 0.0。这是我目前所拥有的:

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,插入符号就会动画化!这是怎么回事?!

如果calculationMode设置为kCAAnimationDiscrete,数组中的第一个值必须是0.0,最后一个值必须是1.0。该数组应该比 values 数组中出现的多一个条目。比如有两个值,那么关键时间应该有3个

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;