【问题标题】:Apply CALayer changes to UIView将 CALayer 更改应用到 UIView
【发布时间】:2014-07-24 12:58:29
【问题描述】:

我有一个 UIView。我将动画应用到它的 CALayer。

[view.layer addAnimation:groupAnimation forKey:name];

我希望图层的最终状态是动画后 UIView 的状态。假设我旋转了 45 度并使用图层移动到新位置;动画后我的视图是否可能处于该状态?因为现在,在动画之后,它又回到了 UIView 的原始状态。我希望能在这方面得到一些帮助。谢谢。

【问题讨论】:

    标签: objective-c core-animation calayer uiviewanimation caanimation


    【解决方案1】:

    要理解的是图层动画只是动画;它只是一种临时覆盖屏幕的“电影”。当动画结束时,“电影”被移除,从而揭示了真实情况。由你决定将这种情况与电影的最后一帧相匹配。

    UIView 动画在很大程度上为您做到了这一点。但是图层动画完全取决于您。

    因此,假设您为位置变化设置动画;做某事以使图层或视图实际上是您动画的位置完全取决于您。

    通常的做法是将更改作为一组单独的命令自己执行。但请注意不要做任何可能触发隐式层动画的事情,因为这会与您尝试显式执行的动画冲突。

    这是示例代码(与您的无关,但它确实显示了一般形式):

    CAAnimationGroup* group = // ...
    // ... configure the animation ...
    [view.layer addAnimation:group forKey:nil];
    // now we are ready to set up the view to look like the final "frame" of the animation
    [CATransaction setDisableActions:YES]; // do not trigger implicit animation by mistake
    view.layer.position = finalPosition; // assume we have worked this out
    

    【讨论】:

    【解决方案2】:

    在为 CALayer 设置动画或使用 CAAnimationGroup 时,必须设置以下属性,例如:

    groupAnimation.removedOnCompletion = NO;
    groupAnimation.fillMode = kCAFillModeForwards;
    

    另见:After Animation, View position resets


    还请注意,将动画直接应用于视图本身可能会有所帮助,而不是通过访问视图的图层。这是使用动画块完成的,我发现它非常有用。

    可以通过多种方式自定义块样式动画,但这里有一个基本示例,当您的视图需要动画时,可以在函数中调用它:

    - (void) animateMyView
    {
        CGRect newViewFrame = CGRectMake(x,y,w,h);
        [UIView animateWithDuration:0.5
                              delay:0
                            options: (UIViewAnimationOptionCurveLinear )
                         animations:^{
                             self.myView = CGAffineTransformMakeRotation (45);
                             [self.myView setBounds:newViewFrame];
                        }
                         completion:NULL];
    }
    

    如需了解更多信息,请参阅Apple's documentation on View Animation

    【讨论】:

    • 我的自动布局被禁用,但动画结束后,它又回到了原来的状态。实际上,我尝试做 UIViewAnimation 但我无法实现我想要的。 CALayer 动画更加灵活。有没有办法确保我的 UIView 与我动画的图层处于相同的状态?
    • 答案已更新以包含以下信息:为 CALayer 设置动画或使用 CAAnimationGroup 时,必须设置以下属性: groupAnimation.removedOnCompletion = NO; groupAnimation.fillMode = kCAFillModeForwards;另见:stackoverflow.com/questions/226555/…
    • 以这种方式滥用removedOnCompletion是绝对错误的做法,不应作为建议提供
    • @matt,什么时候使用removedOnCompletionfillMode 是正确的做法?不能使用表示树中的图层,而不是保持最后一个动画帧和实际图层之间的奇偶性?
    • fillMode 是关于组内不同时间开始/结束的不同动画之间的关系。 removedOnCompletion 几乎不需要。
    猜你喜欢
    • 2010-11-09
    • 2012-08-13
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多