CoreAnimation淡出图层并移动副本而不是仅移动图层

时间:2011-05-26 11:52:09

标签: objective-c cocoa macos core-animation

我正在制作一个显示核心动画图层网格的视图。当我删除一个图层时,我希望该图层淡出并让其他图层移动以填补空白。这几乎与我希望它使用隐式动画的方式一致。唯一的问题是,当这些图层的副本移动到新位置时,应移动的图层会淡出。如何更改该行为以便层移动而不是移动和淡化?

要删除单个图层,我只需执行[theLayer removeFromSuperLayer],然后在容器图层上调用我的布局例程来执行此操作:

CGFloat x = 0;
CGFloat y = CGRectGetMaxY( [layer bounds] ) - buttonHeight - buttonVPadding;
for (CALayer *l in [layer sublayers]) {
    if ([layer bounds].size.width < x + buttonWidth) {
        x = 0;
        y -= buttonHeight + buttonVPadding;
    }
    CGRect bounds = CGRectMake( 0, 0, buttonWidth, buttonHeight );
    [l setBounds: bounds];
    [l setPosition: CGPointMake( x, y )];
    x += buttonWidth + buttonVPadding;
}

我尝试覆盖- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;中的默认动画行为,但我无法找出要覆盖的事件以获得所需的行为。

2 个答案:

答案 0 :(得分:0)

在输入此问题并思考问题后,我找到了解决方案或解决方法。而不是直接删除图层我将其设置为隐藏并跳过布局循环中的隐藏图层。然后在完成所有动画之后(在我的CATransaction的完成块中),我删除所有隐藏的图层而没有动画。

答案 1 :(得分:0)

就我理解的CAAnimation而言,关键参数标识了您正在设置动画的CALayer属性。在你的情况下,这应该是界限和位置。

总的来说,您还要修改子图层属性,因为您要删除一个图层。

所以这三个键是你必须要玩的。

另一方面,通过定义委托actionForKey,您应该有机会查看调用此方法的键。或者您可以检查CALayer中的操作字典。但我不知道它是否有帮助。