Cocoa 删除CALayer'的插值;s内容属性

Cocoa 删除CALayer'的插值;s内容属性,cocoa,core-animation,calayer,Cocoa,Core Animation,Calayer,我们在问这个问题: 为内容关键点添加动画时,显然会触发CATTransitionAnimation,该动画会将原始内容属性淡入动画的值数组中的第一个值,从而导致0.25秒的淡入。而且看起来很糟糕!我已经使用这里讨论的所有方法抑制了每个可设置动画的属性(通过委托将空动画返回到动作字典中,使用CATTransaction),但是这些方法似乎都没有针对这个特定的过渡动画 + (CAKeyframeAnimation *)moveLeftAnimation { CAKeyframeAnimation

我们在问这个问题:

为内容关键点添加动画时,显然会触发CATTransitionAnimation,该动画会将原始内容属性淡入动画的值数组中的第一个值,从而导致0.25秒的淡入。而且看起来很糟糕!我已经使用这里讨论的所有方法抑制了每个可设置动画的属性(通过委托将空动画返回到动作字典中,使用CATTransaction),但是这些方法似乎都没有针对这个特定的过渡动画

+ (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;

我一直在调查什么财产可能对此负责,但无法确定

我需要抑制将动画添加到内容关键点时发生的过渡动画

由于我不知所措,我将放置正在添加的关键帧动画,供您查看。我想也许我做错了什么?请注意,该数组只是6个CGImageRef(动画帧)的数组

}

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

+ (CABasicAnimation *)moveAnimation {

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

return moveAnimation;
}

我在想,当你改变图层的位置时,可能会发生这种转变?我不知道


请帮忙!这简直快把我逼疯了

为了防止出现任何动画,可以将对象设置为
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;
}
-(id)actionForLayer:(CALayer*)层forKey:(NSString*)键
{
if(layer==yourLayer)
{
if([key isEqualToString:@“contents”])
{
返回(id)[NSNull];
}
}
返回零;
}

您可以按照我在中描述的内容做一些事情,通过在该层上的
操作
字典中设置适当的值,可以禁用各种层属性的隐式动画

就你而言,我相信

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

应该防止层的
内容
属性的隐式动画,直到您显式地为其设置动画。

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

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

起初,我认为通过使用CATTransaction,我可以抑制这种隐式的过渡动画,因为苹果的文档让你相信了这一点。使用一个事务,我以你能想象到的所有可能的方式抑制,但它仍然在发生。然后,我尝试通过字典为每个可设置动画的属性返回空动画。不走运。然后我做了同样的事情,但有一个代表。还是不走运

我没有提到的是,在添加动画和移动层的同时,它下面的两个子层正在从它们的超层中移除。我尝试为onOrderOut键添加自定义动画,但没有效果。然后我在StackOverflow上偶然发现了另一个问题,关于为OnOrderRout关键点添加自定义动画。事实证明,很简单,你不能,如果你想在移除一个子层时实现一些其他的动画,你必须使用delagate方法animationDidStop

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

我没有移除子层,而是试图隐藏它们。答对 了太完美了。同样的渐变也发生了,但是没有留下精灵的痕迹。我还是不明白为什么会这样

然后,因为我仍然需要删除这些层,我为精灵的各种运动动画实现了animationDidStop代理方法来删除它们

这是原件:

这是新版本:

所以,虽然我不明白,从技术上讲,为什么会有一个印记,但我几乎可以肯定,它涉及到当你移除一个子层时幕后发生的事情。另外,出于兴趣,我仍然希望在动画开始时隐藏该子层,所以我只是将其设置为隐藏,并提供我自己的过渡动画

+ (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;

所以谢谢大家的帮助。这是一个奇怪的用例,我知道,但如果你曾经想过制作一个基于2d精灵的最终幻想战术,那么希望我的痛苦会对你有利

我来试一试。这不会影响显式添加动画?不,不应该。如果您需要更多控制哪些层或在什么状态下不需要动画,只需向委托方法添加逻辑。它仍然在原始内容属性和动画的第1帧之间插值。我尝试在代理和操作字典中添加空动画。什么都不管用。我投票选出了所有答案,并用代码和图片重新编写了问题。你能再看一眼,看看我的问题是否更有意义吗?我对所有答案都投了赞成票,并用代码和图片重新编写了这个问题。你能再看一眼,看看我的问题是否更有意义吗?@Alec-你在第一次CAKeyframeAnimation中使用线性计时函数显式地设置了
contents
属性的动画。这将覆盖此处讨论的任何方法,这些方法