iOS编程------动画

//
//  ViewController.h
//  UI23_Animation
//
//  Created by l on 15/10/7.
//  Copyright (c) 2015年 lon. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIImageView *imageView;

@property (strong, nonatomic) IBOutlet UITextField *textField;
@end










//
//  ViewController.m
//  UI23_Animation
//
//  Created by l on 15/10/7.
//  Copyright (c) 2015年 lon. All rights reserved.
//

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

#pragma mark ---------------- 动画概述 ----------------------

    /* UI23 动画
                                  --> 属性动画
     CALayer 动画 --> UIView 动画  --> 过渡动画
                                  --> 仿射动画

     CALayer 层  核心绘制层

     CAAnimation 核心动画

     */


    //一. UIView 动画
    //1.属性动画
    //UIView 做动画有两种方式, 动画块方式和block方式, 通常我们使用block方式.

    //常用的属性有 背景色, alpha, center, frame, bounds等.



    //二. CALayer 核心 绘画层
    //UIView 和 CALayer 的关系
    //UIView 并不进行渲染和绘画,真正负责渲染的是CALayer
    //UIView可以看做是CALayer的代理,负责展示内容以及用户进行交互.
    //UIView创建的时候带一个CALayer,UIView与绘制和渲染相关的属性其实是CALayer的属性,比如背景颜色.
    //CALayer有很多的属性,UIView可以直接使用只是其中一部分,比如CALayer的圆角等.

    //1.创建一个CALayer对象
    CALayer *layer = [[CALayer alloc] init];

    //2.设置属性
    layer.frame = CGRectMake(200, 50, 100, 100);

    //圆角
    layer.cornerRadius = 50; // 0.5 宽

    //边框宽度
    layer.borderWidth = 2;

    //边框颜色
    layer.borderColor = [UIColor redColor].CGColor;

    //阴影颜色
    layer.shadowColor = [UIColor blueColor].CGColor;

    //阴影透明度,默认为 0
    layer.shadowOpacity = 0.5;

    //阴影偏移量
    layer.shadowOffset = CGSizeMake(10, 10);

    //背景颜色
    layer.backgroundColor = [UIColor yellowColor].CGColor;

    //锚点
    //x , y  0.0 ~ 1.0 之间数
    //默认为 0.5 , 0.5 中心点
    layer.anchorPoint = CGPointMake(0, 0);
    layer.position = CGPointMake(200 + 50, 50 + 50);

    // anchorPoint 默认在视图的中心点,
    // layer 的postion 就是 anchorPoint 在父坐标系中的位置为 x: frame.x + 0.5 * width
    // y: frame.y + 0.5 * height


    // 我们通常设置 如果想要设置position 和 frame 相等。则只要设置 锚点为左上角,则 postion 和 frame 就相等了,但是如果之前设置了frame 会发现 更改锚点后,实际位置会发生变化,这是因为
    // 本来
    // position.x  = frame.x +   0.5 * width

    //      250            200         50

    // position.y = frame.y + 0.5 *height
    //      100           50       50


    // frame 为 200 50  position 为 250 100

    // 设置锚点为0 。0 后,重新绘制了视图 position 和 frame相等
    // 因此frame 变为  200  50  ---->  250 100


    //3.添加到父 layer上
    [self.view.layer addSublayer:layer];


    //需求:设置一张圆角图片,QQ个人头像
    //更改imageView的layer
    //圆角
    _imageView.layer.cornerRadius = 50;
    //边框
    _imageView.layer.borderWidth = 2;

    _imageView.layer.borderColor = [UIColor yellowColor].CGColor;

    //边界马赛克, 边界遮罩
    _imageView.layer.masksToBounds = YES; //显示到边界

    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark-------- 1.UIView属性动画------------

- (IBAction)propertyAnimation:(id)sender {

    //iOS3.0之前UIView的动画方法都是类方法,需要我们把动画写在一个动画块里面.
    /*
     [UIView beginAnimation:]

     //设置动画属性

     [UIView commitAnimations]
    */

    //1.开始动画
    [UIView beginAnimations:@"动画名称" context:@"传递给代理的参数"];

    //2.设置动画
    //动画持续时间,重复几次,是否反转等等.
    [UIView setAnimationDuration:2]; //动画时间

//    [UIView setAnimationRepeatCount:2];//重复次数

//    [UIView setAnimationRepeatAutoreverses:YES];//反转

    [UIView setAnimationDelegate:self];//默认就是self

    //代理触发的两个方法:
    //动画开始之前触发
    [UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];

    //动画结束之后触发sel方法
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    //3.设置动画
    _imageView.frame = CGRectMake(275, 50, 100, 100);

    //4.提交动画
    [UIView commitAnimations];


}

- (void)animationWillStart:(NSString *)animationID context:(void *)context {

    NSLog(@"动画开始");
    _imageView.backgroundColor = [UIColor yellowColor];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

    NSLog(@"动画结束");
    //从右边再移动左边
    //1.设置开始
    [UIView beginAnimations:nil context:nil];

    //2.设置动画
    [UIView setAnimationDuration:2];

    [UIView setAnimationDelegate:self];

    [UIView setAnimationDidStopSelector:@selector(propertyAnimation:)];

    //3.更改属性
    _imageView.frame = CGRectMake(0, 50, 100, 100);

    //4.提交动画
    [UIView commitAnimations];
}

// 重复动画
- (void)repeatAnimation
{
    [self propertyAnimation:nil];
}



#pragma mark---------- 1.1 block 动画 --------------
- (IBAction)blockAnimation:(id)sender {

    //iOS4.0 使用block封装了 动画块相关的方法,方便我们的使用.
    //block 动画方法也是类方法
//    [UIView animateWithDuration:2 animations:^{
//        _imageView.frame = CGRectMake(275, 50, 100, 100);
//    }];

    [UIView animateWithDuration:2 animations:^{
        _imageView.frame = CGRectMake(275, 50, 100, 100);

    } completion:^(BOOL finished) {
        [UIView animateWithDuration:2 animations:^{

            _imageView.frame = CGRectMake(0, 50, 100, 100);

        } completion:^(BOOL finished) {

                [self blockAnimation:nil];
            }];
        }];

}

#pragma mark ----------- 1.2 过渡动画 ----------
/*
- (IBAction)translateAnimation:(id)sender {

    //1.创建secondVC
    SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    secondVC.view.backgroundColor = [UIColor yellowColor];

    //2.父视图
    UIView *superView = self.view.superview;

    //3.过渡动画

    //过渡动画也是类方法
    //1.自己做动画
    //需求, self.view 从父视图上面移除, secondVC.view添加到父视图上
    //因此需要做动画的视图为父视图self.view.superView
    //参数1 容器视图, 需要做动画的视图

    //当block是另一个页面的属性时,页面间传值的时候需要防止重复引用.
    __weak typeof(self) WeakSelf = self;

//    [UIView transitionWithView:self.view.superview duration:0.5 options:UIViewAnimationOptionTransitionCurlUp animations:^{
//        //动画操作 移除当前视图 添加second.view
//        [self.view removeFromSuperview];
//        
//        [superView addSubview:secondVC.view];
//       
//    } completion:nil];

    //方法二. 两个页面间过渡
    [UIView transitionFromView:self.view toView:secondVC.view duration:1 options:(UIViewAnimationOptionTransitionCurlUp) completion:nil];

    //添加子视图
    [self addChildViewController:secondVC];




}
*/

#pragma mark---------- 2. 仿射变换 ------------------
static int k = 10;
- (IBAction)rotationAnimation:(id)sender {

    //仿射变换通常做三种样式的变换
    //1.旋转 2.平移 3.缩放
    //变换时有基于初始状态和基于上一次变换状态的两种
    [UIView animateWithDuration:0.01 animations:^{

        //旋转角度单位 -> 弧度    π -> 180角度对应的弧度
        //弧度π 角度° π = 180°
        //1°对应的弧度 = π / 180°
//        _imageView.transform = CGAffineTransformMakeRotation(M_PI);

       //(2)以上次变化为基准
        CGAffineTransform angle = CGAffineTransformMakeRotation(k * M_PI / 180);
        _imageView.transform = angle;

         //(1)以原始状态为基准
//        _imageView.transform = CGAffineTransformRotate(_imageView.transform, M_PI / 180); //基于上一次状态.

    } completion:^(BOOL finished) {

        k += 10; //每次增加10

        [self rotationAnimation:nil];
    }];

}

#pragma mark------------- 3.1 核心 基本动画 --------
- (IBAction)basicAnimation:(id)sender {

    //给某一个属性做动画

    //"opsition"
    //1.创建基本动画对象
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"position"];

    //2.设置起始Value
    basic.fromValue = [NSValue valueWithCGPoint:_imageView.layer.position];

    //3.结束
    basic.toValue = [NSValue valueWithCGPoint:(CGPointMake(325, 100))];

    //4.设置动画
    basic.duration = 2; //2秒

    //5.给layer层添加核心动画 指定做动画的属性
    [_imageView.layer addAnimation:basic forKey:@"position"];

    //动画结束后,更改position
    _imageView.layer.position = CGPointMake(325, 100);


}

#pragma mark--------- 3.2 关键帧动画 -----------
- (IBAction)keyframe:(id)sender {

    _textField.backgroundColor = [UIColor redColor];

    //实现晃动效果
    //1.创建关键帧动画对象,指定属性
    CAKeyframeAnimation *keyframe = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];

    //2.设置position.x的变化范围
    CGFloat centerX = _textField.layer.position.x;

    //移动到左边的位置
    CGFloat left = centerX - 10;
    //右边
    CGFloat right = centerX + 10;

    //3.创建运动轨迹
    NSNumber *l = [NSNumber numberWithFloat:left];

    NSNumber *c = [NSNumber numberWithFloat:centerX];

    NSNumber *r = [NSNumber numberWithFloat:right];

    //4.添加到帧动画的value数组中
    keyframe.values = @[l, c, r, l, c, r, l, c, r, l, c, r, l, c, r];

    //5.设置动画持续时间
    keyframe.duration = 0.5;

    //6.添加动画
    [_textField.layer addAnimation:keyframe forKey:@"position.x"];



}

#pragma mark-------- 3.3 组动画 -----------------
- (IBAction)groupAnimation:(id)sender {

    //1.创建一个动画组
//    CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
    CAAnimationGroup *group = [CAAnimationGroup animation];

    //2.创建基本动画 移动 旋转

    //创建移动动画对象
    CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];

    CGFloat centerX = _imageView.layer.position.x;

    CGFloat endX = 325;

    //起始值value
    move.fromValue = [NSValue valueWithCGPoint:(CGPointMake(centerX, 100))];

    //最终value
    move.toValue = [NSValue valueWithCGPoint:(CGPointMake(endX, 100))];

    //设置move动画时间
    move.duration = 2;

    //创建旋转动画对象
    CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform"];

    //fromValue
    rotation.fromValue = [NSValue valueWithCATransform3D:_imageView.layer.transform];

    //toValue
    rotation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 0, 1)];

    //动画时间
    rotation.duration = 2;

    //3.把多个动画对象添加到动画数组里面
    group.animations = @[move, rotation];
    group.duration = 2;

    //4.给layer添加组动画
    [_imageView.layer addAnimation:group forKey:@"group"];



}

#pragma mark---------- 3.4 核心过渡动画 ----------

- (IBAction)translateAnimation:(id)sender {

    //1.创建过渡动画对象
    CATransition *transition = [CATransition animation];

    //2.设置过渡动画类型和动画方式
    transition.type = @"cube"; //立方体

    //动画执行的方式
    transition.subtype = kCATransitionFromRight;

    //动画持续时间
    transition.duration = 0.5;

    //3.添加动画
    [self.view.superview.layer addAnimation:transition forKey:@"立方体效果"];

    //4.移除当前视图 添加secondVC 视图

    SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    secondVC.view.backgroundColor = [UIColor whiteColor];

    UIView *superView = self.view.superview;

    [self.view removeFromSuperview];

    [superView addSubview:secondVC.view];

    //添加子视图控制器
    [self addChildViewController:secondVC];

}



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

@end








/






//
//  SecondViewController.h
//  UI23_Animation
//
//  Created by l on 15/10/7.
//  Copyright (c) 2015年 lon. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@end








//
//  SecondViewController.m
//  UI23_Animation
//
//  Created by l on 15/10/7.
//  Copyright (c) 2015年 lon. All rights reserved.
//

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

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

#pragma mark----------- 返回上一个页面 ----------
//过渡动画
- (IBAction)backUp:(id)sender {

    [UIView transitionFromView:self.view toView:self.parentViewController.view duration:1 options:(UIViewAnimationOptionTransitionCurlDown) completion:nil];
}


/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end


![animation](http://img.blog.csdn.net/20151007191900134)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值