删除CALayer内容属性的插值

时间:2010-12-02 11:16:24

标签: cocoa core-animation calayer

重新问这个问题:

当您为内容键添加动画时,显然会触发CATransitionAnimation,将原始内容属性淡化为动画值数组中的第一个值,从而导致.25秒淡入淡出。它看起来很糟糕!我使用这里讨论的所有方法(通过委托将null动画返回到动作字典中,使用CATransaction)来抑制每个可动画的属性,但这些都不是针对这个特定的过渡动画。

alt text

我一直在研究什么财产可能对此负责,但无法弄明白。

我需要禁止在向内容键添加动画时发生的过渡动画。

由于我正处于这样的损失,我将把你正在添加的关键帧动画看出来。我想也许我在这里做错了什么?请注意,该数组只是一个包含6个CGImageRefs(动画帧)的数组。

+ (CAKeyframeAnimation *)moveLeftAnimation {

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animation.values = [NSArray arrayWithArray:[Setzer walkingLeftSprite]];
animation.duration = 0.5f;
animation.keyTimes = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0], 
                      [NSNumber numberWithFloat:0.2], 
                      [NSNumber numberWithFloat:0.4],
                      [NSNumber numberWithFloat:0.6],
                      [NSNumber numberWithFloat:0.8],
                      [NSNumber numberWithFloat:1.0],
                      nil];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
return animation;

}

另外,我在精灵的动作词典中有一个处理位置键的动画:

+ (CABasicAnimation *)moveAnimation {

CABasicAnimation *moveAnimation = [CABasicAnimation animation];
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
moveAnimation.duration = 0.5f;

return moveAnimation;

}

我想也许当你改变图层的位置时会发生这种转变?我不知道......

请帮忙!这让我坚持不懈!

3 个答案:

答案 0 :(得分:1)

要阻止任何动画,您可以将对象设置为CALayer的委托,然后实现‑actionForLayer:forKey:委托方法并返回空对象:

- (id<CAAction>)actionForLayer:(CALayer*)layer forKey:(NSString*)key 
{
    if(layer == yourLayer)
    {
        if([key isEqualToString:@"contents"])
        {
            return (id<CAAction>)[NSNull null];
        }
    }
    return nil;
}

答案 1 :(得分:1)

您可以按照我在this answer中描述的内容执行某些操作,其中我通过在该图层上的actions字典中设置适当的值来禁用各种图层属性的隐式动画。

在你的情况下,我相信像

NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                   [NSNull null], @"contents",
                                   nil];
layer.actions = newActions;
[newActions release];

应该阻止图层contents属性的隐式动画,直到您明确为其设置动画。

答案 2 :(得分:1)

以下是关于如何解决这个难题的一些注释,以及每个人的答案如何提供了一个难题。

重述问题:当我将关键帧动画添加到CALayer的@contents键时,原始内容属性和关键帧动画的第一帧之间似乎有.25秒的淡入淡出过渡。这看起来很糟糕,我想摆脱它。

起初,我当然认为通过使用CATransaction我可以抑制这种隐式转换动画,因为这是Apple的文档引导您相信的。使用交易,我以你能想象的一切可能的方式压制,但它仍然在发生。然后我尝试通过字典为每个可动画的属性返回NULL动画。没运气。然后我做了同样的事情,但有一个代表。仍然没有运气。

我没有提到的是,同时添加了动画并且正在移动图层,其下面的两个子图层正从其超级图层中移除。我尝试为onOrderOut键添加自定义动画,但无济于事。然后我偶然发现了StackOverflow上的另一个问题,关于为onOrderOut键添加自定义动画。事实证明,很简单,你不能,如果你想要在删除子层时实现其他动画,你必须使用delagate方法animationDidStop。 How can I use custom animations for onOrderOut in Core Animation?

所以在这一点上,我确信这个鬼图像与实际的图层无关,精灵本身。为了测试这个,我只是没有添加它下面的子层。果然,当我移动精灵时,没有挥之不去的幽灵。它看起来很完美。然后我添加了鬼魂下面的图层。这几乎就像精灵的内容被吸引到它下面的层中一样,所以当它们被移除时,会有一种印记。

我没有删除子图层,而是试图隐藏它们。答对了。它是完美的。发生了相同的淡入淡出过渡,但没有留下精灵的印记。我仍然不明白为什么会这样。

然后,因为我仍然需要删除这些图层,所以我为sprite的各种移动动画实现了animationDidStop委托方法以删除它们。

这是原作:

alt text

这是新版本:

alt text

因此,虽然我不明白,从技术上来说,为什么会出现一个印记,我几乎可以肯定它会关注当您删除子图层时幕后发生的事情。此外,为了感兴趣,我仍然希望在动画开始时隐藏子图层,所以我只是将其设置为隐藏并提供我自己的过渡动画。

感谢大家的帮助。这是一个奇怪的用例,我知道,但是如果你一直在考虑制作基于2d sprites的最终幻想战术ripoff,那么希望我的痛苦对你有利!