先插句题外话:今天知道了结构体转对象用 NSValue from
动画是提高用户交互的神器,主要有UIView动画和CALayer动画.我们经常用到的还是UIView的Block动画 一定要弄清楚参数.
UIView的属性动画
#pragma mark UIView - PorpertyAnimations
- (void)handlePorpertyAnimation
{
//开始动画
[UIView beginAnimations:nil context:nil];
//设置动画执行的时间(时间单位是秒)
[UIView setAnimationDuration:1];
//设置动画重复的次数
[UIView setAnimationRepeatCount:2];
//设置动画是否反转
[UIView setAnimationRepeatAutoreverses:YES];
//设置动画的变化曲线
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
//设置UIView旋转
self.redView.transform = CGAffineTransformRotate(self.redView.transform, M_PI) ;
//设置代理人
[UIView setAnimationDelegate:self];
//设置动画结束的时候执行的操作
[UIView setAnimationDidStopSelector:@selector(restorePresentState)];
//设置动画从当前状态开始
[UIView setAnimationBeginsFromCurrentState:YES];
//指定需要做动画的视图的属性
self.redView.center = CGPointMake(self.redView.center.x, self.redView.center.y + 200);
//改变视图的透明度
self.redView.alpha = 0.0;
[UIView commitAnimations];
必须记得提交
过渡动画
//处理过度动画
- (void)handleTransitionAnimation
{
//单一视图的过度动画
// [UIView transitionWithView:self.redView duration:1.0 options: UIViewAnimationOptionTransitionFlipFromLeft animations:^{
// self.redView.transform = CGAffineTransformScale(self.redView.transform, 0.9, 0.9);
// } completion:^(BOOL finished) {
// self.redView.transform = CGAffineTransformScale(self.redView.transform, 10/9.0, 10/9.0);
// }];
//两个视图之间的过度动画
UIView *greenView = [[UIView alloc]initWithFrame:self.redView.frame];
greenView.backgroundColor = [UIColor greenColor];
[UIView transitionFromView:self.redView toView:greenView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
[UIView transitionFromView:greenView toView:self.redView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
}];
}];
}
//Block动画样式4 弹簧效果
//参数1:动画执行的时间;参数2:动画延迟执行的时间 参数3:代表弹簧的振动频率(数值越小振动频率越高) 参数4:开始的速度 参数5:动画的效果(是否反转,重复,变化曲线) 参数6:执行的动画操作,参数7:动画执行完成的操作
[UIView animateWithDuration:1.0 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:10 options:UIViewAnimationOptionCurveEaseIn animations:^{
self.bannerBtn.center = CGPointMake(self.bannerBtn.center.x, self.bannerBtn.center.y + 100);
} completion:^(BOOL finished) {
self.bannerBtn.center = CGPointMake(self.bannerBtn.center.x, self.bannerBtn.center.y - 100);
}];
CALayer动画:
//默认状态下视图的基准点和锚点与视图的中心点重合,视图旋转的时候必须围绕一个点进行旋转,但是这个点必须保证视图的锚点和基准点刚好在该位置重合.锚点的坐标范围(0~1之间)
//因为基准点是相对父视图坐标而言,所以锚点必须主动向基准点靠齐.
UIView和CALayer这两种动画的区别就是UIView会真正的改变frame,而CALayer只是改变了视图效果,视图并没有真正的改变.