0

我有一个UIView。我将动画应用到CALayer。将CALayer更改应用到UIView

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

我希望图层的最终状态成为动画后UIView的状态。比方说,我旋转了45度,并移动到一个新的位置使用图层;动画之后我的观点能否处于这种状态?因为现在,在动画之后,它会回到UIView的原始状态。我希望能得到一些帮助。谢谢。

回答

0

要理解的是,层动画只是动画;它只是一种覆盖屏幕的临时“电影”。当动画结束时,“电影”被删除,从而揭示真实情况。这是由你来配合电影的最后一帧的情况。

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 
+0

并从这里开始看到我关于此主题的完整教程:http://www.apeth.com/iOSBook/ch17.html#_using_a_cabasicanimation – matt

+0

感谢您的这一点。你太棒了! – cessmestreet

-1

当动画化的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

+0

我的自动布局被禁止,但仍动画后,它会恢复到原来的状态。实际上,我尝试了UIViewAnimation,但是我无法实现我想要的。 CALayer动画更加灵活。有没有一种方法可以确保我的UIView将处于与其动画层相同的状态? – cessmestreet

+0

回答更新,以包括以下信息: 当一个动画或CALayer的使用CAAnimationGroup,以下属性必须设置: groupAnimation.removedOnCompletion = NO; groupAnimation.fillMode = kCAFillModeForwards; 另请参阅:http://stackoverflow.com/questions/226555/after-animation-view-position-resets – JRJ

+0

以这种方式滥用'removedOnCompletion'绝对是错误的事情,不应该给建议 – matt