知识架构

  1. CALayer 图层类
  2. CABasicAnimation 基础动画
  3. CAKeyFrameAnimation 帧动画
  4. CATransition 转场动画
  5. CAAnimationGroup 动画组
  •   layer的基本概念

  其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(CALyer对象),通过UIView的layer属性可以访问这个层。

  •   基本属性

    Bounds;position;frame;backgroundColor; opacity;cornerRadius;borderWidth; borderColor;shadowOffset; shadowColor; shadowOpacity;

    我写了一些简单的demo,大家可以看看.......

//

//  ViewController.m

//  简单的动画

//

//  Created by 李盼盼 on 16/5/16.

//  Copyright © 2016年 李盼盼. All rights reserved.

//

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) CALayer *subLayer;

@property (strong, nonatomic) UIView *redView;

@property (strong, nonatomic) CALayer *subLayer2;

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

@property (assign, nonatomic) NSInteger currentIndex;

@end

@implementation ViewController

- (void)viewDidLoad {

self.view.backgroundColor = [UIColor colorWithRed:234/255.0f green:234/255.0f blue:234/255.0f alpha:1];

[super viewDidLoad];

//    行走的方块

_subLayer = [[CALayer alloc]init];

_subLayer.frame = CGRectMake(50, 50, 50, 50);

_subLayer.backgroundColor = [UIColor redColor].CGColor;

[self.view.layer addSublayer:_subLayer];

//    旋转放大的方块

_redView = [[UIView alloc]initWithFrame:CGRectMake(200, 100, 50, 50)];

_redView.backgroundColor = [UIColor yellowColor];

[self.view addSubview:_redView];

//    慢慢放大的方块

_subLayer2 = [[CALayer alloc]init];

_subLayer2.frame = CGRectMake(50, 250, 50, 50);

_subLayer2.backgroundColor = [UIColor grayColor].CGColor;

[self.view.layer addSublayer:_subLayer2];

//    仿真翻页

_imageView.image = [UIImage imageNamed:@"a0.jpg"];

_currentIndex = 0;

}

#pragma mark ---- 上一张

- (IBAction)Last:(UIButton *)sender {

if (_currentIndex == 0) {

_currentIndex = 12;

}else{

_currentIndex--;

}

_imageView.image = [UIImage imageNamed:[NSString  stringWithFormat:@"a%ld.jpg",_currentIndex]];

//    转场动画

CATransition *anim = [CATransition animation];

//    过度类型

anim.type = @"pageUnCurl";

//    动画过渡方向

anim.subtype = @"fromTop";

anim.duration = 0.8;

[_imageView.layer addAnimation:anim forKey:nil];

}

#pragma mark ---- 下一张

- (IBAction)next:(UIButton *)sender {

if (_currentIndex == 12) {

_currentIndex = 0;

}else{

_currentIndex++;

}

_imageView.image = [UIImage imageNamed:[NSString  stringWithFormat:@"a%ld.jpg",_currentIndex]];

CATransition *anim = [CATransition animation];

anim.type = @"pageCurl";

anim.subtype = kCATransitionFromBottom;

anim.duration = 0.8;

[_imageView.layer addAnimation:anim forKey:nil];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

#pragma mark ---- 旋转放大的动画

CABasicAnimation *rotationAnim = [CABasicAnimation animation];

//    rotationAnim.duration = 2;

rotationAnim.keyPath = @"transform.rotation.z";

rotationAnim.toValue = @(3.14);

rotationAnim.repeatCount = MAXFLOAT;

CABasicAnimation *scaleAnim = [CABasicAnimation animation];

scaleAnim.duration = 2;

scaleAnim.keyPath = @"transform";

scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 2, 0)];

scaleAnim.repeatCount = MAXFLOAT;

CAAnimationGroup *group = [CAAnimationGroup animation];

group.animations = @[rotationAnim,scaleAnim];

group.duration = 5;

group.fillMode = kCAFillModeForwards;

group.removedOnCompletion = NO;

[_redView.layer addAnimation:group forKey:nil];

}

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

#pragma mark ---- 行走的方块

CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];

anim.keyPath = @"position";

anim.duration = 5.0;

NSValue *value = [NSValue valueWithCGPoint:CGPointMake(50, 50)];

NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(50, 100)];

NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];

NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];

NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(50, 50)];

anim.values = @[value,value1,value2,value3,value4,value5];

// 设置动画的执行节奏

// kCAMediaTimingFunctionEaseInEaseOut:开始较慢,中间会加速,结束会减速

anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

[self.subLayer addAnimation:anim forKey:nil];

#pragma mark ---- 慢慢放大的方块

CABasicAnimation *anim1 = [CABasicAnimation animation];

//   动画执行是我时候修改属性

anim1.keyPath = @"bounds";

//    起始值

//    anim1.fromValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 50, 50)];

//    目标值

anim1.toValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 100, 100)];

anim1.delegate = self;

anim1.duration = 5;

[_subLayer2 addAnimation:anim1 forKey:@"animation"];

/**不删除动画,同时保存动画最终效果**/

// 动画结束后自动删除动画

anim.removedOnCompletion = NO;

// 默认保存原来的样式:设置为使用最新的样式

anim.fillMode = kCAFillModeForwards;

}

- (IBAction)removeAnim:(UIButton *)sender {

[_subLayer2 removeAnimationForKey:@"animation"];

}

#pragma mark ---- 动画的代理

-(void)animationDidStart:(CAAnimation *)anim{

NSLog(@"%s",__func__);

}

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

NSLog(@"%s",__func__);

}

@end

效果如下:

iOS简单动画的更多相关文章

  1. IOS 简单动画 首尾式动画

    首尾式动画 首尾式动画即通过实现控件由初始状态到结束状态的过程.(主要表现在控件的Frame 透明度 ) // // ViewController.m // CX 简单动画 // // Created ...

  2. iOS 简单动画 序列帧动画

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"旭宝爱吃 ...

  3. iOS 简单动画 block动画

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ UIView * view = [ ...

  4. iOS简单动画效果:闪烁、移动、旋转、路径、组合

    #define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...

  5. iOS CAReplicatorLayer 简单动画

    代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...

  6. iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

    本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segm ...

  7. IOS 核心动画之CAKeyframeAnimation - iBaby

    - IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...

  8. Swift 实现iOS Animation动画教程

    这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...

  9. iOS 开发--动画

    在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细 ...

随机推荐

  1. [转载]C++堆栈的入门学习

    申明:   转自    http://www.cnblogs.com/pengshao/archive/2011/12/26/2301461.html 头文件stackDemo.h #pragma o ...

  2. Lua面向对象

    lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下: 1 Account = {balance = 0}2 function Account.withdraw(v)3 Acc ...

  3. 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  4. maven模块

    用maven无它,唯方便而. 模块依赖可以用来做一些公共模块,多个工程调用. 先子模块 install 或者package.在父模块install

  5. linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

    计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) ...

  6. redis原子性读写操作之LUA脚本和watch机制

    最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,因此为了解决建立在内存上高并发情况下的事务控制,使用了spring封装的RedisTemplate执行lua脚本进行原 ...

  7. LeetCode记录(1)——Array

    1.Two Sum naive 4.Median of Two Sorted Arrays 找两个已排序数组的中位数 直接数可以过,但很蠢,O(m+n)时间 class Solution { publ ...

  8. argparse解析参数模块

    一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数,例如python parseTes ...

  9. Qt在pro文件中加入带空格的路径(使用$$quote关键字)

    LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib) INCLUDEPATH += $$quote(C: ...

  10. selenium RC+JAVA 运行所遇到的问题

    1.报错一 Failed to start new browser session: java.lang.RuntimeException: Firefox 3 could not be found ...