慢动作下动画
@implementation DZAnimatedController {
UIView *_view1;
UIView *_view2;
UIView *_view3;
BOOL selected;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"AnimatedController";
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.frame)-60)/2, CGRectGetHeight(self.view.frame)-80, 60, 60)];
view1.backgroundColor = [UIColor greenColor];
[self.view addSubview:view1];
[view1.layer setCornerRadius:30];
[view1.layer setMasksToBounds:YES];
_view1 = view1;
_view1.alpha = 0;
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.frame)-60)/2, CGRectGetHeight(self.view.frame)-80, 60, 60)];
view2.backgroundColor = [UIColor blueColor];
[self.view addSubview:view2];
[view2.layer setCornerRadius:30];
[view2.layer setMasksToBounds:YES];
_view2 = view2;
_view2.alpha = 0;
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.frame)-60)/2, CGRectGetHeight(self.view.frame)-80, 60, 60)];
view3.backgroundColor = [UIColor redColor];
[self.view addSubview:view3];
[view3.layer setCornerRadius:30];
[view3.layer setMasksToBounds:YES];
_view3 = view3;
_view3.alpha = 0;
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake((CGRectGetWidth(self.view.frame)-60)/2, CGRectGetHeight(self.view.frame)-80, 60, 60);
btn.backgroundColor = [UIColor grayColor];
[self.view addSubview:btn];
[btn.layer setCornerRadius:30];
[btn.layer setMasksToBounds:YES];
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
/**
iOS中的动画就是围绕着UIView的几个属性来玩的, frame, bounds, center, background, transform, alpha, coententStretch,
iOS中动画的方式有三种:
1. UIView(UIViewAnimation): 也成首尾式动画
2. UIView(UIViewAnimationWithBlock): block动画, iOS中最常用, 是对首尾式动画的进一步封装.
3. CoreAnimation: 主要作用CALayer
*/
//通过(描述弹簧的运动)时间曲线 来 执行动画, 当阻尼比为1的时候, 该动画 将(没有任何震荡地)平稳的减速到最终的模型值,
//阻尼比小于1的话,将反复震荡直到完全停止.
/* Performs `animations` using a timing curve described by the motion of a spring. When `dampingRatio` is 1, the animation will smoothly
decelerate to its final model values without oscillating. Damping ratios less than 1 will oscillate more and more before coming to a complete stop.
You can use the initial spring velocity to specify how fast the object at the end of the simulated spring was moving before it was attached. It's a unit
coordinate system, where 1 is defined as travelling the total animation distance in a second. So if you're changing an object's position by 200pt in
this animation, and you want the animation to behave as if the object was moving at 100pt/s before the animation started, you'd pass 0.5. You'll
typically want to pass 0 for the velocity. */
//timing curve 时间曲线
//motion of spring 弹簧的运动(移动)
//dampingRato 阻尼比
//oscillating 震荡
}
- (void)clickBtn:(UIButton *)btn {
[UIView animateWithDuration:.5 delay:0 usingSpringWithDamping:.4 initialSpringVelocity:.6 options:UIViewAnimationOptionCurveLinear animations:^{
if(!selected) {
_view1.alpha = 1;
_view2.alpha = 1;
_view3.alpha = 1;
_view1.transform = CGAffineTransformMakeTranslation(-80, -100);
_view2.transform = CGAffineTransformMakeTranslation(0, -100);
_view3.transform = CGAffineTransformMakeTranslation(80, -100);
} else {
_view1.alpha = 0;
_view2.alpha = 0;
_view3.alpha = 0;
_view1.transform = CGAffineTransformIdentity;
_view2.transform = CGAffineTransformIdentity;
_view3.transform = CGAffineTransformIdentity;
}
[btn setEnabled:NO];
} completion:^(BOOL finished) {
selected = !selected;
[btn setEnabled:YES];
}];
}
@end