【问题标题】:Core Animation problem on iPhoneiPhone上的核心动画问题
【发布时间】:2011-01-27 12:10:46
【问题描述】:

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

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

我正在使用的代码(在超级视图的方法内)如下:

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];

有人知道问题可能是什么吗?

【问题讨论】:

    标签: iphone core-animation


    【解决方案1】:

    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];
    

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

    【讨论】:

    • 我希望我能加倍投票。知道这真的很有用。谢谢。
    • 我非常同意诺亚 - 非常感谢!这解释了很多,可能正是我需要的。 @Noah - 我会代表你给 Brad 一个赞成票......
    【解决方案2】:

    您在通用 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];
    

    【讨论】:

    • 非常好的问题!我有一种感觉是有原因的,但如果有的话,我似乎再也想不起来了。可能与我提出整个想法的方向有关。不过,我会让你一试,看看会发生什么。谢谢!
    • 成功了!我现在会保持这种状态,但是如果我弄清楚为什么我会以另一种方式这样做并决定改回原路,我可能会再回来为您挑选更多的大脑。 :-) 谢谢!
    【解决方案3】:

    您需要在此处使用显式 CATransaction 吗?

    文档here 暗示您不这样做。

    【讨论】:

    • 我的第一个原型使用了隐式动画,但是当我第一次观察到这个问题时,我认为如果有帮助的话,可能值得尝试显式动画。我想现在我知道这无济于事,我可以把它拿出来,但我只是认为最好准确地发布我目前所拥有的东西,以防万一。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多