5

嗨,我正在从多个图像创建一个关键帧动画。我的问题是我希望动画立即从一个图像变为下一个图像,而不是淡出。

    CALayer *animLayer = [CALayer layer];
    animLayer.bounds = CGRectMake(0, 0, width, height);
    animLayer.position = CGPointMake(0, 0);

    CAKeyframeAnimation *customFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
    NSArray *sizeValues = [NSArray arrayWithObjects:(id)image1, (id)image2, nil];
    NSArray *times = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:0.5f], nil]; 
    NSArray *timingFunctions = [NSArray arrayWithObjects: [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault], [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault], nil];

    [customFrameAnimation setValues:sizeValues];
    [customFrameAnimation setKeyTimes:times];

    customFrameAnimation.duration=5.0;
    customFrameAnimation.beginTime = 1e-100;
    customFrameAnimation.fillMode = kCAFillModeRemoved;
    customFrameAnimation.timingFunctions = timingFunctions;
    customFrameAnimation.removedOnCompletion = YES;
    [animLayer addAnimation:customFrameAnimation forKey:nil]; 

提前致谢。

4

1 回答 1

13

您的动画需要将其计算模式设置为 kCAAnimationDiscrete。

查看关于 keyTimes的文档,其中描述了如何使用计算模式:

keyTimes 数组中的适当值取决于calculationMode 属性。

  • 如果计算模式设置为 kCAAnimationLinear,则数组中的第一个值必须为 0.0,最后一个值必须为 1.0。值在指定的关键时间之间进行插值。

  • 如果计算模式设置为kCAAnimationDiscrete,则数组中的第一个值必须为 0.0。

  • 如果计算模式设置为 kCAAnimationPaced 或 kCAAnimationCubicPaced,则忽略 keyTimes 数组。

如果 keyTimes 数组中的值对计算模式无效或不合适,则忽略 keyTimes 数组。

然后您可以阅读计算模式的说明:

价值计算模式

这些常量由计算模式属性使用。

NSString * const kCAAnimationLinear;

NSString * const kCAAnimationDiscrete;

NSString * const kCAAnimationPaced;

常数

kCAAnimationLinear

关键帧值之间的简单线性计算。
适用于 Mac OS X v10.5 及更高版本。在 CAAnimation.h 中声明。

kCAAnimationDiscrete

依次使用每个关键帧值,不计算内插值。适用于 Mac OS X v10.5 及更高版本。在 CAAnimation.h 中声明。

kCAAnimationPaced

关键帧值被插值以在整个动画中产生均匀的节奏。
适用于 Mac OS X v10.5 及更高版本。在 CAAnimation.h 中声明。

换句话说,离散计算模式使动画跳转到每个关键帧,而不是动画/过渡到它。

最好的祝福。

于 2010-10-28T05:09:04.493 回答