iPhone上的核心动画问题

时间:2010-03-14 23:29:24

标签: iphone core-animation

我是iPhone开发的新手,并且正在使用Core Animation进行一些实验。关于我正在尝试的动画的持续时间,我遇到了一个小问题。

基本上,我有一个带有两个子视图的视图,我正在尝试设置其不透明度的动画,以便一个淡入而另一个淡出。问题是,子视图不是逐渐淡入/淡出,而是立即切换到/从完全/零不透明度。我试图用CATransaction调整动画持续时间而没有明显的效果。它也不是特定于动画不透明度 - 动画位置显示同样的问题。

我正在使用的代码(在superview的方法内)如下:

CALayer* oldLayer = ((UIView*) [[self subviews] objectAtIndex:0]).layer;
CALayer* newLayer = ((UIView*) [[self subviews] objectAtIndex:1]).layer;

[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
oldLayer.opacity = 0.0;
newLayer.opacity = 1.0;
[CATransaction commit];

有谁知道问题可能是什么?

3 个答案:

答案 0 :(得分:18)

Noah的解决方案是最干净的方式来做你想要的,但是你没有看到动画的原因是为支持UIViews的CALayers禁用了隐式动画。因为没有动画,CATransaction无法设置任何内容的持续时间。

如果您真的想在图层上执行此动画,则需要设置手动CABasicAnimation来执行此操作:

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.removedOnCompletion = NO;
opacityAnimation.fillMode = kCAFillModeForwards;

[oldLayer addAnimation:opacityAnimation forKey:@"opacity"];
[newLayer addAnimation:opacityAnimation forKey:@"opacity"];

[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
oldLayer.opacity = 0.0;
newLayer.opacity = 1.0;
[CATransaction commit];

(请注意,我不确定您是否可以在此处重复使用不透明度动画。您可能需要为每个图层创建单独的实例。)

答案 1 :(得分:4)

您是否有理由在通用UIView动画包装上使用Core Animation?用

做这样的事情非常简单
UIView *oldView = [[self subviews] objectAtIndex:0];
UIView *newView = [[self subviews] objectAtIndex:1];

[UIView beginAnimations:@"swapViews" context:nil];
[UIView setAnimationDuration:1];
    oldView.alpha = 0;
    newView.alpha = 1;
[UIView commitAnimations];

答案 2 :(得分:2)

您是否需要在此处使用明确的CATransaction?

文档here暗示你没有。