原文

http://www.cnblogs.com/letougaozao/p/3673927.html

  • UIActivityIndicatorView
  • UIImageView的序列帧动画
  • UIView动画
  • 时钟动画

一、UIActivityIndicatorView 

1⃣️属性

-isAnimating属性判断是否正在动画

2⃣️第三方库SVProgressHUD

[SVProgressHUD dismiss]

[SVProgressHUD showWithStatus:@“网络加载中” maskType:SVProgressHUDMashTypeGradient];(后面的参数是否遮挡,可以不用)

3⃣️  NSTimer

[NSTimer scheduledTimerWithTimeInterval:1 target:2 selector:3 userInfo:4 repeats:5];

1.时间间隔 2.self 3.触发时调用的方法 4.用户信息 5.是否重复

[timer invalidate];

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  // 使用了SVProgress的maskType属性,当前视图无法接受触摸事件
  // 需要想办法关闭
  // 使用NSTimer
  if ([_indicatorView isAnimating]) {
    [SVProgressHUD dismiss];
    [_indicatorView stopAnimating];
  } else {
    [SVProgressHUD showWithStatus:@"等会~~~" maskType:SVProgressHUDMaskTypeGradient];

    // 指示器一启动,就无法交互了,要把时钟放在这里
    [_indicatorView startAnimating];

    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:NO];
  }
}// NSTimer调用方法的参数,只能是NSTimer,使用参数,在当前示例中,就不需要使用成员变量了
- (void)updateTimer:(NSTimer *)timer
{
  [SVProgressHUD dismiss];
  [_indicatorView stopAnimating];

  // 关闭时钟
  [timer invalidate];
}

二、UIImageView的序列帧动画 
1⃣️属性说明

-animationImages:要显示的一组图盘

-animationDuration:显示所有图片需要的时间(如果中间由修改速度,需要先停止、设置、开始)

-animationRepeatCount:动画的执行次数

2⃣️相关方法

--(void)startAnimating;

--(void)stopAnimating

--(void)isAnimating;

1.赵云动画

// 创建赵云的序列帧动画
- (void)createZhaoyunImage
{
  // Do any additional setup after loading the view, typically from a nib.
  // 设置ImageView的序列帧动画
  // 1. 需要一个数组
  NSMutableArray *images = [NSMutableArray array];
  for (int i = 1; i < 11; i++) {
    NSString *fileName = [NSString stringWithFormat:@"/images/zy/%d.png", i];
    UIImage *image = [UIImage imageNamed:fileName];
    [images addObject:image];
  }

  [_zhaoyunImage setImage:images[0]];
  // 设置图像数组
  [_zhaoyunImage setAnimationImages:images];
  // 设置10张图片播放的时长
  [_zhaoyunImage setAnimationDuration:1.0f];
  // 开始动画
  [_zhaoyunImage startAnimating];
}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if ([_zhaoyunImage isAnimating]) {
    // 序列帧动画每次停止的时候,都会显示设置的图像,而不是当前播放到的图像
    [_zhaoyunImage stopAnimating];
  } else {
    [_zhaoyunImage startAnimating];
  }
}

2.燕子动画

#pragma mark - 拖拽燕子
- (void)dragBird:(UIPanGestureRecognizer *)sender
{
  // 先需要知道手指的位置
  CGPoint location = [sender locationInView:self.view];

  // 手势状态改是UIGestureRecognizerStateChanged的时候,手指还没有离开屏幕
  // 这个时候,可以修改鸟的位置,同时让鸟扑腾
  if (sender.state == UIGestureRecognizerStateChanged) {
    // 注意:如果要修改播放中的序列帧动画
    // 1. 需要先停止动画
    [_birdImage stopAnimating];
    // 2. 修改动画频率
    [_birdImage setAnimationDuration:0.2f];
    // 3. 重新启动动画
    [_birdImage startAnimating];

    // 修改燕子的动画频率
    // 设置燕子的位置
    [_birdImage setCenter:location];
  } else if (sender.state == UIGestureRecognizerStateEnded) {
    // 恢复燕子慢悠悠
    // 1. 需要先停止动画
    [_birdImage stopAnimating];
    // 2. 修改动画频率
    [_birdImage setAnimationDuration:1.2f];
    // 3. 重新启动动画
    [_birdImage startAnimating];  }
}// 设置燕子的序列帧动画,并设置燕子的拖拽手势监听
- (void)createBirdImage
{
  // 设置燕子的序列帧动画
  NSArray *images = @[[UIImage imageNamed:@"/images/素材/燕子1.png"],
            [UIImage imageNamed:@"/images/素材/燕子2.png"]];
  [_birdImage setAnimationImages:images];
  [_birdImage setAnimationDuration:1.2f];
  [_birdImage startAnimating];

  // 定义手势
  UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(dragBird:)];
  [_birdImage addGestureRecognizer:pan];

  // 设置燕子图片允许用户交互
  [_birdImage setUserInteractionEnabled:YES];
}


三、UIView动画 

四、时钟动画(CADisplayLink)

-是一种以屏幕刷新屏幕触发的时钟机制,每秒钟执行大约60次

-倒入QuartzCore框架

1⃣️使用方法

-定义CADisplayLink并制定触发调用方法

-将显示链接添加到主运行循环队列

2⃣️两种判断时间间隔的方法

-以成员变量的方式判断

-以全局变量的方式判断

@interface ViewController ()
{
  // 游戏时钟
  CADisplayLink *_gameTimer;

  // 时钟触发的初始时间
  CFTimeInterval _startTime;
}
@end
@implementation ViewController#pragma mark - 使用指定时间处理CADisplayLink触发时间的方法(1)
- (void)updateTimer:(CADisplayLink *)sender
{
  // 如果_startTime=0,说明是第一次触发时钟,需要记录时钟的时钟戳记
  if (_startTime == 0) {
    _startTime = sender.timestamp;
  }

  // 时钟触发的时间差值
  CFTimeInterval deltaTime = sender.timestamp - _startTime;

  if (deltaTime > 1.0) {
    NSLog(@"时钟触发了 %f", sender.timestamp);

    // 更新_startTime的数值,记录本次执行任务的时间
    _startTime = sender.timestamp;
  }
}#pragma mark - 使用指定时间处理CADisplayLink触发时间的方法(2)
- (void)step
{
  // 假定每隔一秒触发一次方法
  if (steps % (10 * 60 * 60) == 1) {
    NSLog(@"时钟触发了! %ld", steps);
  }

  steps++;
}- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  // 首先将启动的时间点设置为0
  _startTime = 0.0f;

  // 将屏幕刷新总次数设置为0
  steps = 0;

  // 初始化游戏时钟
  _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
  // 初始化时钟之后,有一个必须要做的,就是把游戏时钟,添加到主运行循环
  [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
3⃣️使用步骤
方法1:

-初始化一个游戏时钟,并且加入主队列中

-自己制定时间间隔,去执行操作

1.需要一个成员变量,记录时钟起始的“时间点”:CFTimeInterval _startTime;

2.计算成员变量去与时钟触发时的时间差,如果大于制定的时间差,再去执行操作

方法2:

-定义一个全局的每秒中执行的次数

-如果执行了这个次数,就执行要执行的操作

steps = 0;
  // 初始化雪花图像
  _snowImage = [UIImage imageNamed:@"/images/素材/雪花"];

  // 初始化时钟
  _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
  [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
#pragma mark - 时钟处理方法
- (void)step
{
  // 假设每秒钟绘制6个雪花
  if (steps % 10 == 0) {
    // 绘制雪花
    UIImageView *imageView = [[UIImageView alloc]initWithImage:_snowImage];

    // 指定雪花出现的位置
    CGPoint startPoint = CGPointMake(arc4random() % 320, -30.0);
    // 指定雪花结束的位置
    CGPoint endPoint = CGPointMake(arc4random() % 320, 490);
    /**
     新问题
     1. 雪花太大
     2. 雪花太亮,需要改一下透明度
     3. 如果雪花会转就更好了
     */
    CGFloat r = arc4random() % 5 + 10;
    [imageView setFrame:CGRectMake(0, 0, r, r)];

    // 设置起始点
    [imageView setCenter:startPoint];

    // 把雪花图像添加到视图
    [self.view addSubview:imageView];

    [UIView animateWithDuration:6.0f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
      [imageView setCenter:endPoint];
      [imageView setAlpha:0.2f];
      [imageView setTransform:CGAffineTransformMakeRotation(M_PI)];
    } completion:^(BOOL finished) {
      // 从父视图删除,这个千万不要忘了
      [imageView removeFromSuperview];
    }];
  }

}

iOS开发学习之简单动画相关推荐

  1. 【IOS开发进阶系列】动画专题

    1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hello_Hwc/archive/123447.html 1.1 基本概念 1.1.1 CA ...

  2. IOS开发学习周报(二)

    IOS开发学习周报(二) 简介 课程名称 IOS开发实训 任课老师 郑贵锋老师&字节跳动工程师 学号 16340015 专业(方向) 软件工程(计应) 姓名 陈彬彬 Email 9441312 ...

  3. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  4. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇-简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  5. ios开发学习笔记--Core Motion

    iOS开发学习笔记之CoreMotion-运动传感器 官网文档:CoreMotion Framework Reference 一.     简介 现在的苹果手机都基本有运动传感器,能够过获取到设备的加 ...

  6. IOS开发基础之核心动画 基础动画、关键帧、组动画案例

    IOS开发基础之核心动画 基础动画.关键帧.组动画案例 案例源码在我的主页里.实现效果图 // // ViewController.m // 30-核心动画 // // Created by 鲁军 o ...

  7. 李洪强iOS开发之- 实现简单的弹窗

     李洪强iOS开发之- 实现简单的弹窗 实现的效果:  112222222222223333333333333333

  8. IOS开发学习笔记-----UILabel 详解

    IOS开发学习笔记-----UILabel 详解 01 //创建uilabel 02 UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMa ...

  9. iOS开发-ZFPlayer的简单使用 播放单个网络视频

    iOS开发-ZFPlayer的简单使用 播放单个网络视频 前言 开发准备 代码 注意 前言 关于ZFPlayer播放单个网络视频案例,它的网络列表视频案例在gitHub上面很多. 开发准备 podfi ...

最新文章

  1. 字符串BF和KMP匹配算法
  2. JDK里常见容器总结
  3. WinMain中的Console与main中的Window
  4. Dlib学习笔记:解决dlib array2d转 OpenCV Mat时颜色失真
  5. Ajax — 评论列表
  6. FFT/NTT/FMT/FWT题目
  7. win10如何提高电脑画质_win10电脑怎么提高画质 | 手游网游页游攻略大全
  8. python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
  9. python需要下载哪些软件-学python下载什么软件开发
  10. hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)
  11. 解读汽车机械工作原理GIF图 懂得三个算你牛!
  12. Android商品详情页上拉查看详情
  13. EXCEL工作表保护密码破解
  14. python写android抢票软件,如何用python写一个简单的12306抢票软件
  15. 信息安全服务资质认证实施规则
  16. 小程序源码:修复登录接口仿抽奖助手
  17. oracle 删除数据违反约束条件,ORA-02292: 违反完整约束条件 处理
  18. 国内明明有期货公司,为什么那么多人却喜欢做外盘呢
  19. K65 Flex_CAN模块初始化
  20. 织梦wap.php怎么改,利用DEDECMS织梦建立wap站

热门文章

  1. JdbcTemplate基础【项目demo】【基础知识】【简单明了,一眼就会】
  2. 基于wasm的探索与研究(一)
  3. 服装销售中,你的导购会赞美吗?
  4. CentOS6和CentOS7区别
  5. 漫画:什么是 “原型模式” ?
  6. 权限系统 6_1权限管理
  7. Unity_EasyAR4.0_前置后置摄像头切换
  8. 异数OS-织梦师-管仲(八) 并发危机解决之道
  9. linux抓包工具(wireshark与tcpdump)
  10. Hybrid Contrastive Learning with Cluster Ensemble for Unsupervised Person Re-identification