#import "VCView.h"

@implementation VCView

-(void)awakeFromNib {

    //[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(changeY) userInfo:nil repeats:YES];

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(changeY)];
//想要让CADisplayLink让它工作,必须得要把它添加到主运行循环当中.
//当每一次屏幕刷新的时候就会调用指定的方法(屏幕每一少刷新60),一秒调用60次
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; //setNeedsDisplay会调用drawRect:,但是它并不是立马调用.只是设了一个标志.当下一次屏幕刷新的时候才去调用drawRect
} static int _snowY = ; - (void)changeY{ _snowY += ;
if (_snowY > [UIScreen mainScreen].bounds.size.height) {
_snowY = ;
}
//重绘
[self setNeedsDisplay];
NSLog(@"%s",__func__);
} - (void)drawRect:(CGRect)rect {
// Drawing code
UIImage *image = [UIImage imageNamed:@"雪花"];
[image drawAtPoint:CGPointMake(, _snowY)];
} @end

1.定时器雪花整体思路:

先在控制器View面绘制一个雪花.

在View加载完毕后,添加一个定时器.

在定时器方法当中调用得绘方法.

在绘图方法当不段的去修改雪花的Y值.

当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始.

2.添加定时器实现方案

第一种采用NSTime

第二种采用CADisplayLink

最终采用CADisplayLink方案.

2.1为什么采用CADisplayLink方案不用NSTime?

首先要了解setNeedsDisplay

setNeedsDisplay底层会调用DrawRect方法重绘.

但是它不是立马就进行重绘.它仅仅是设置了一个重绘标志,等到下一次屏幕刷新的时候才会调用DrawRect方法.

如果使用NSTime的话,假设是0.01调用一次重绘.假设屏幕0.02秒的时候它才刷新一次.中间就会等0.01秒.

也就是每次都会等0.01秒这样累加上去.让变的越来越卡顿.

使用CADisplayLink时,它的定时器方法就是屏幕每次刷新的时候就会调用(通常屏幕一秒钟刷新60次)

它和setNeedsDisplay调用DrawRect方法的时机正好吻合,不会出间等待间隔.不会出现屏幕卡顿现象.

2.2如何使用CADisplayLink添加定时器?

Target:哪个对象要监听方法.

selector:监听的方法名称.

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self

selector:@selector(setNeedsDisplay)];

想要让CADisplayLink工作,必须得要把它添加到主运行循环.

只要添加到主运行循环, 跟模式没有关系

[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

3.具体实现代码如下:

-(void)awakeFromNib{

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self

selector:@selector(setNeedsDisplay)];

[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

}

- (void)drawRect:(CGRect)rect {

if(_snowY > rect.size.height){

_snowY = 0;

}

UIImage *image = [UIImage imageNamed:@"雪花"];

[image drawAtPoint:CGPointMake(0, _snowY)];

_snowY += 10;

}

iOS开发Quartz2D之 七:雪花效果的更多相关文章

  1. ios开发中超简单抽屉效果(MMDrawerController)的实现

    ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...

  2. iOS开发 - Quartz2D画图

    Quartz 2D简单介绍 是一个二维画图引擎,同一时候支持iOS和Mac系统 Quartz 2D能完毕的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  3. iOS开发-Quartz2D初识

    Quartz2D如果单独的从Quartz,那么会发现Quartz是一个开源的Java作业调度框架,单独从英文翻译的角度来看的话Quartz的英文是石英,如果有的时候不小心搜索会发现手表推荐.本文中介绍 ...

  4. IOS开发-UIView之动画效果的实现方法(合集)

    http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化 ...

  5. iOS开发小技巧--实现毛玻璃效果的方法

    一.美工出图 二.第三方框架 -- DRNRealTimeBlur,框架继承自UIView.使用方法:创建UIView直接继承自框架的View,就有了毛玻璃效果 三.CoreImage -- 图片加高 ...

  6. iOS开发Quartz2D 十三:画板涂鸦

    一:效果如图: 二:代码 #import "ViewController.h" #import "DrawView.h" #import "Handl ...

  7. iOS开发Quartz2D之十二:手势解锁实例

    一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...

  8. iOS开发Quartz2D十二:手势解锁实例

    一:效果如图: 二:代码: #import "ClockView.h" @interface ClockView() /** 存放的都是当前选中的按钮 */ @property ( ...

  9. iOS开发Quartz2D 三 进度条的应用

    一:效果如图: 二:代码 #import "ViewController.h" #import "ProgressView.h" @interface View ...

随机推荐

  1. 负载均衡器&http正向代理

    透明的负载均衡器&http正向代理 * master-workers架构,http正向代理由独立的dns请求以及缓冲进程  * 使用epoll(ET)模式,採用全异步方式(双缓存,实现双向同一 ...

  2. XMPP开发之从零開始

    对于server的搭建和设置.我在这里就不再多说了.有好多前辈已经帮大家攻克了.能够參考下这篇博客 XMPPserver配置 我依照这个博客配置好了,server后,然后在网上參照代码写了一个小的de ...

  3. 2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化

    转自:https://www.cnblogs.com/chenying99/archive/2013/05/23/3094128.html 技巧: 用 JAXM 发送和接收 SOAP 消息—Java ...

  4. ubuntu搭建交叉编译环境makeinfo: command not found

    解决办法:sudo apt-get install texinfo

  5. 图片拖拽缩放功能:兼容Chrome、Firefox、IE8+

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. CISP/CISA 每日一题 九(2017-11-30 09:25)

    电子银行风险管理责任: 1.风险管理是董事会和高级管理层的责任 2.实施技术是信息技术高级管理层的责任 3.测量和监控风险是经营管理层的责任     管理层在实施一个新的电子银行应用程序之前要 ___ ...

  7. HDU 1506 Largest Rectangle in a Histogram(DP)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. GO语言学习(十五)Go 语言指针

    Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...

  9. Mycat 读写分离+分库分表

    上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试 Mycat就不用多介绍了,可以实现很多分布式数据库的功 ...

  10. WebService--CXF以及CXF与Spring的整合(jaxws:server形式配置)

    前言:好记性不如烂笔头,写博客的好处是,以前接触的东西即便忘记了,也可以从这里查找. Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来 ...