zoukankan      html  css  js  c++  java
  • 关情纸尾-----Quartz2D-定时器CADisplayLink下雪效果

    定时器CADisplayLink下雪效果

    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.具体实现代码如下:

     1 -(void)awakeFromNib{
     2   CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
     3   [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
     4 
     5 }
     6 
     7 
     8 - (void)drawRect:(CGRect)rect {
     9    if(_snowY > rect.size.height){
    10     _snowY = 0;
    11     }
    12   UIImage *image = [UIImage imageNamed:@"雪花"];
    13   [image drawAtPoint:CGPointMake(0, _snowY)];
    14   _snowY += 10;
    15 }
  • 相关阅读:
    从零开始unity3D (1) 折腾环境
    QT环境搭建 (1)
    wpf调用VC++ dll
    Bluetooth 笔记(摘抄)
    android (SharedPreferences、Intent)笔记
    黄油刀使用笔记
    mavlink安装
    Eclipse alt+/ 失效 解决
    Spring IOC, DI, AOP 原理和实现
    工程目录结构
  • 原文地址:https://www.cnblogs.com/Lorraine1/p/4802361.html
Copyright © 2011-2022 走看看