我想在视图的两种状态之间动画。比如说,我有一个带有标签的视图,当我更改标签的文本时,动画会呈现页面翻转时发生的变化。使用自定义动画在视图的两种状态之间动画
现在你当然可以做到这一点与[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];
}
...但你不能使用你自己的自定义动画,你被卡住的内置动画(他们是好的,但它们并不适合我的需求)。
因此,另一种选择是一个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";
}
然后你可以随意设置任何动画核心动画让你做。如果我定义一个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;
}
但是,当我定义动画是例如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;
}
相反,我想在“页面1”状态的视图保持可见,直到动画结束而在“页面2”状态的视图进入帧,正是因为它与行为过渡动画。
当然,我总是可以在复制视图的同时让其中一个显示为兄弟视图,同时为最前面的视图制作动画并在完成时将其从超视图中移除...但是必须有更直接的方法才能实现这个相当简单的动画效果而不影响视图。
可能的事情告诉了一层,但我不知道是什么,而这也正是我需要你的帮助,球员:)
谢谢!