使用自定义动画在视图的两个状态之间设置动画

KPM*_*KPM 6 cocoa cocoa-touch core-animation objective-c ios

我想在视图的两个状态之间制作动画.比如说,我有一个带标签的视图,当我更改标签的文本时,动画会将更改呈现为页面翻转.

现在你可以用以下方法做到这一点[UIView setAnimationTransition:forView:cache:]:

- (IBAction)nextPage {
    [UIView beginAnimation:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:pageView cache:NO];
    label.text = @"page 2";
    [UIView commitAnimations];
}

- (IBAction)previousPage {
    [UIView beginAnimation:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:pageView cache:NO];
    label.text = @"page 1";
    [UIView commitAnimations];
}
Run Code Online (Sandbox Code Playgroud)

...但是你不能使用你自己的自定义动画,你会坚持使用内置的动画(它们很好但是它们不适合我的需要).

所以另一个选择是CAAnimation在视图的图层中添加一个:

- (IBAction)nextPage {
    CAAnimation *animation = [self animationWithDuration:1 forward:NO];
    [pageView.layer addAnimation:animation forKey:@"pageTransition"];
    label.text = @"page 2";
}

- (IBAction)previousPage {
    CAAnimation *animation = [self animationWithDuration:1 forward:YES];
    [pageView.layer addAnimation:animation forKey:@"pageTransition"];
    label.text = @"page 1";
}
Run Code Online (Sandbox Code Playgroud)

然后您可以自由设置Core Animation允许您执行的任何动画.如果我定义CATransition动画,这很有效,例如kCATransitionReveal:"页面2"状态的视图在"页面1"状态下出现,因为它会滑出.

- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
    CATransition *animation = [CATransition animation]; 
    [animation setType:kCATransitionReveal];
    [animation setSubtype:forward?kCATransitionFromLeft:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];

    animation.duration = duration; 
    return animation; 
}
Run Code Online (Sandbox Code Playgroud)

但是当我将动画定义为例如a时CABasicAnimation,只能看到一个视图状态.

- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = 1.0 / -1000;
    transform = CATransform3DRotate(transform, M_PI, 0.0f, 1.0f, 0.0f);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    if(forward) {
        animation.fromValue = [NSValue valueWithCATransform3D:transform];
    } else {
        animation.toValue = [NSValue valueWithCATransform3D:transform];
    }

    animation.duration = duration; 
    return animation; 
}
Run Code Online (Sandbox Code Playgroud)

相反,我希望"页面1"状态中的视图在动画结束之前保持可见,而"页面2"状态中的视图进入框架,就像它使用过渡动画一样.

当然,我总是可以弄乱复制视图并让一个看起来像一个兄弟视图,同时我为最前面的一个制作动画并在完成后从superview中删除它...但是必须有一个更直接的方法来实现这个相当简单的动画影响而不会搞砸视图.

可能要告诉图层,但后来我不知道是什么,这就是我需要你帮助的地方,伙计:)

谢谢!

Gob*_*bra 0

那么,您可以创建一个图层,将其内容设置为代表视图最终状态的图像,然后将动画应用到该图层。动画完成后,您可以删除图层并切换视图状态。

我认为这比实例化整个视图效果更好。