您的位置:首页 > 移动开发 > IOS开发

iOS中的动画

2015-09-17 19:17 519 查看
#import "ViewController.h"
#import "UITextField+Shake.h"
@interface ViewController ()
@property (retain, nonatomic) IBOutlet UIImageView *balloonImage;
@property (retain, nonatomic) IBOutlet UIButton *springBtn;

@property (retain, nonatomic) IBOutlet UITextField *shuruTF;
@property (retain, nonatomic) IBOutlet UIView *redVC;
@property (retain, nonatomic) IBOutlet UIImageView *cloudImage;

@property (retain, nonatomic) UIView *yellowView;

@end

@implementation ViewController

- (IBAction)StartBtn:(id)sender {
//[self handlePropertyAnimation]; //UIView 属性动画
//[self handlePropertyAnimationBlock]; // Block形式
//[self handleTransition]; //过度动画
//[self handleUIViewAndCALayer];
//[self handleBasicAnimation];
//[self handleKeyFrameAnimation];
//输入输入框
//[self.shuruTF shake];

//[self handleCATransition];

[self handleCAgroup];

}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//    self.yellowView = [[[UIView alloc] initWithFrame:self.redVC.frame] autorelease];
//    self.yellowView.backgroundColor = [UIColor yellowColor];
//    self.yellowView.tag = 100;

}

#pragma mark -- UIView动画
//UIView 属性动画
//能够做动画的属性:frame,center,bounds,alpha,transform,backgroundColor
- (void)handlePropertyAnimation{
//iOS4.0 之前如果想做动画,必须放在开始可提交之间才有效
//对属性更改值是有效值,最终会对视图做出修改
//开始动画
[UIView beginAnimations:nil context:nil];
//1.设置动画持续时间 - s
[UIView setAnimationDuration:3];
//2.设置动画代理 --- 但是,不需要服从代理
[UIView setAnimationDelegate:self];
//3.设置代理结束之后执行的方法
[UIView setAnimationDidStopSelector:@selector(handleDidStop)];
//4.试着动画的延迟的时间 - s
//[UIView setAnimationDelay:2];
//5.设置动画从当前状态发生变化
[UIView setAnimationBeginsFromCurrentState:YES];
//6.设置动画是否反转
[UIView setAnimationRepeatAutoreverses:YES];
//7.设置动画重复次数
[UIView setAnimationRepeatCount:10];
//8.设置变化的变化曲线
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

//center --视图位置
CGPoint center = self.redVC.center;
center.y += 10;
self.redVC.center = center;
//alpha -- 透明度
self.redVC.alpha = 0.2;
//transform -- 旋转和缩放

self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4);

self.redVC.transform = CGAffineTransformScale(self.redVC.transform, 0.5, 0.5);

//提交
[UIView commitAnimations];
}
//动画结束后实现的方法,让视图恢复原状
- (void)handleDidStop{
//center 回到原来的位置

self.redVC.center = self.view.center;
//alpha 恢复为1.0
self.redVC.alpha = 1.0;
//transform 回到原来的位置
self.redVC.transform = CGAffineTransformIdentity;

}

//iOS4.0之后 基于Block的动画 -- (推荐)
- (void)handlePropertyAnimationBlock{

//    [UIView animateWithDuration:4 animations:^{
//        //1.最简单的block动画
//        /*
//         //对属性更改,做动画效果
//         //center --视图位置
//         CGPoint center = self.redVC.center;
//         center.y += 10;
//         self.redVC.center = center;
//         //alpha -- 透明度
//         self.redVC.alpha = 0.2;
//         //transform -- 旋转和缩放
//
//         self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4);
//
//         self.redVC.transform = CGAffineTransformScale(self.redVC.transform, 0.5, 0.5);
//
//         */
//        //.Block 版本升级 -- 可检测动画结束时间
//        //对属性更改,做动画效果
//        //center --视图位置
//        CGPoint center = self.redVC.center;
//        center.y += 10;
//        self.redVC.center = center;
//        //alpha -- 透明度
//        self.redVC.alpha = 0.2;
//        //transform -- 旋转和缩放
//
//        self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4);
//
//        self.redVC.transform = CGAffineTransformScale(self.redVC.transform, 0.5, 0.5);
//
//
//   } completion:^(BOOL finished) {
//       [self handleDidStop];
//   }];

//Block 形式 加强版 -- 不光可以捕获动画结束时间,而且可以配置多个参数
//    [UIView animateWithDuration:4 delay:2 options:UIViewAnimationOptionAutoreverse animations:^{
//        CGPoint center = self.redVC.center;
//        center.y += 10;
//        self.redVC.center = center;
//        //alpha -- 透明度
//        self.redVC.alpha = 0.2;
//        //transform -- 旋转和缩放
//
//        self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4);
//
//        self.redVC.transform = CGAffineTransformScale(self.redVC.transform, 0.5, 0.5);
//
//
//    } completion:^(BOOL finished) {
//        [self handleDidStop];
//    }];
//4.弹簧效果
//1:持续时间,2.延迟时间,3.弹簧强度,4.开始变化速度,5.动画效果参数6.动画代码,7.结束动画
[UIView animateWithDuration:8 delay:0 usingSpringWithDamping:0.001 initialSpringVelocity:3 options:UIViewAnimationOptionCurveEaseInOut animations:^{
CGPoint center = self.redVC.center;
center.y += 10;
self.redVC.center = center;
//alpha -- 透明度
self.redVC.alpha = 0.8;
//transform -- 旋转和缩放

// self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI);

self.redVC.transform = CGAffineTransformScale(self.redVC.transform, 1.5, 1.5);

} completion:^(BOOL finished) {
[self handleDidStop];
}];

}

//过渡动画 -- 界面间的过渡
- (void)handleTransition{
//1.只产生变化效果,但是界面没有切换
/*
[UIView transitionWithView:self.redVC duration:3 options:UIViewAnimationOptionCurveEaseInOut animations:^{
//旋转
self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4); // M_PI_4 旋转45 M_PI_2 旋转90 M_PI 旋转180度
} completion:^(BOOL finished) {
//[self handleDidStop];
}];
*/
//2.从一个视图,切换到另一个视图
[UIView transitionFromView:self.redVC toView:self.yellowView duration:3 options:UIViewAnimationOptionTransitionCurlDown completion:^(BOOL finished) {
UIView *tempView= [self.redVC retain];
self.redVC = self.yellowView;
self.yellowView = tempView;
[tempView release];

}];

}

#pragma mark -- UIView与 CALayer
//UIView 与CALayer 的区别
//UIView 其实是CALayer 层的简单封装,真正来绘制显示内容的还是CALayer,每一个视图对象都有一个Layer属性可以访问到自己的layer层.UIView只是封装了常用属性,不常用的属性还是要设置CALayer.
- (void)handleUIViewAndCALayer{
//1.设置视图边框的宽度
self.redVC.layer.borderWidth = 2;
//2.设置视图边框的颜色
self.redVC.layer.borderColor = [UIColor whiteColor].CGColor;
//3.设置视图的圆角
self.redVC.layer.cornerRadius = 10;
//4.超出
self.redVC.layer.masksToBounds = YES;
//5.设置视图的锚点 -- 旋转的基准点  (锚点和旋转的基准点相同是,才会按设定的点转)
self.redVC.layer.anchorPoint = CGPointMake(1, 1);
// CGRect frame = self.redVC.frame;
//CGRectGetMinX  --- 获取一个视图的最小x
//CGRectGetMinY --- 获取一个视图最小的y
//CGRectGetMaxX -- 获取一个视图最大的x
//CGRectGetMaxY -- 获取一个视图最大的y
//self.redVC.layer.position = CGPointMake(CGRectGetMaxX(frame), CGRectGetMaxY(frame));
self.redVC.layer.position = CGPointMake((89+142), (215+138));
self.redVC.transform = CGAffineTransformRotate(self.redVC.transform, M_PI_4);

}

#pragma mark -- CALayer 动画

//CA属性动画 -- 基本属性动画
//CA动画修改属性值,最终不会作用到视图
//CAAnimation 基类
- (void)handleBasicAnimation{
/*
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"opacity"];
//变化开始值
basic.fromValue = @(1.0);
//变化结束值
basic.toValue = @(0.2);
//添加到视图的 layer 层
[self.redVC.layer addAnimation:basic forKey:nil];
*/

//让云动起来
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"position.x"];
//变化的开始值
basic.fromValue = @(self.cloudImage.center.x);
//变化的结束值
basic.toValue = @([UIScreen mainScreen].bounds.size.width + CGRectGetWidth(self.cloudImage.frame) / 2);
basic.duration = 10;
basic.repeatCount = 100;

//添加的视图的layer层
[self.cloudImage.layer addAnimation:basic forKey:nil];
//    NSLog(@"%f",self.cloudImage.frame.size.width);
//    if (self.cloudImage.frame.size.width > ((89+142) / 2)) {
//        [self handlePropertyAnimationBlock];
//    }
}

//CA属性动画 -- 关键帧动画
-(void)handleKeyFrameAnimation{
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position"];

CGPoint point1 = self.cloudImage.center;
CGPoint point2 = CGPointMake([UIScreen mainScreen].bounds.size.width /2, 60);
CGPoint point3 = CGPointMake([UIScreen mainScreen].bounds.size.width, self.cloudImage.center.y);

NSValue *value1 = [NSValue valueWithCGPoint:point1];
NSValue *value2 = [NSValue valueWithCGPoint:point2];
NSValue *value3 = [NSValue valueWithCGPoint:point3];

keyFrame.values = @[value1,value2,value3,value1];
//添加到视图layer层
keyFrame.duration = 10;
keyFrame.repeatCount = 100;
[self.cloudImage.layer addAnimation:keyFrame forKey:nil];
}

/* 过渡效果
fade     //交叉淡化过渡(不支持过渡方向) kCATransitionFade
push     //新视图把旧视图推出去  kCATransitionPush
moveIn   //新视图移到旧视图上面   kCATransitionMoveIn
reveal   //将旧视图移开,显示下面的新视图  kCATransitionReveal
cube     //立方体翻滚效果
oglFlip  //上下左右翻转效果
suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)
rippleEffect //滴水效果(不支持过渡方向)
pageCurl     //向上翻页效果
pageUnCurl   //向下翻页效果
cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)
cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)
*/

/* 过渡方向
kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromBottom
*/
//CA过渡动画
- (void)handleCATransition{
CATransition *transition = [CATransition animation];
//配置过度动画类型
transition.type = @"cube";
//transition.duration = 100;
//配置过度动画方向
//transition.subtype = kCATransitionFromLeft;
//添加视图layer层
[self.redVC.layer addAnimation:transition forKey:nil];
}

//CA 分组动画

- (void)handleCAgroup{

//1.关键帧动画 -- 沿圆形轨迹移动
CAKeyframeAnimation *keyFrame1 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGFloat y = [UIScreen mainScreen].bounds.size.width;

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, y) radius:y startAngle:-M_PI_2 endAngle:M_PI_2 clockwise:YES];

//关键帧动画给上圆形轨迹
keyFrame1.path = path.CGPath; //让贝塞尔曲线作为移动轨迹
keyFrame1.duration = 10;

//2.关键帧动画 -- 气球放大缩小

CAKeyframeAnimation *keyFrame2 = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
keyFrame2.values = @[@(1.0),@(1.2),@(1.4),@(1.6),@(1.8),@(2.0),@(1.8),@(1.6),@(1.4),@(1.2),@(1.0)];
keyFrame2.duration = 10;

//3.创建分组
CAAnimationGroup *group= [CAAnimationGroup animation];
group.animations = @[keyFrame2,keyFrame1];
group.duration = 1000;
[self.balloonImage.layer addAnimation:group forKey:nil];

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)dealloc {
self.yellowView = nil;
[_shuruTF release];
[_redVC release];
[_cloudImage release];
[_balloonImage release];
[_springBtn release];
[super dealloc];
}
@end


UITextField+Shake.h

#import <UIKit/UIKit.h>

@interface UITextField (Shake)
//抖动
- (void)shake;
@end

#import "UITextField+Shake.h"

@implementation UITextField (Shake)
//抖动
- (void)shake{
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];
keyFrame.values = @[@(self.layer.position.x - 10), @(self.layer.position.x),@(self.layer.position.x + 10),@(self.layer.position.x)];
//设置重复次数
keyFrame.repeatCount = 7;
//持续时间
keyFrame.duration = 0.1;
//添加到视图的layer层
[self.layer addAnimation:keyFrame forKey:nil];
}
@end


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: