使用CADisplayLink(定时器)实现雪花(Quartz2D)

1、选择CADisplayLink而不使用NSTimer?

  • 如果以后每隔一段时间需要重绘,一般不使用NSTimer,因为NSTimer刷新会有延时,使用CADisplayLink不会刷新的时候有延迟

2、代码实现:

  • 自定义视图DrawView
// .h 文件
#import 

@interface DrawView : UIView

@end

// .m文件实现
#import "DrawView.h"

@implementation DrawView

- (void)drawRect:(CGRect)rect {
    // Drawing code
    static CGFloat snowY = 0;
    UIImage *image = [UIImage imageNamed:@"雪花"];
    [image drawAtPoint:CGPointMake(0, snowY)];
    snowY += 10;
    if (snowY > rect.size.height) {
        snowY = 0;
    }
}

//setNeedsDisplay 绑定一个标识,等待下次刷新的时候才会调用drawRect方法

- (nonnull instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
        self.backgroundColor = [UIColor blackColor];
        
        // 定时器
        // 每次屏幕刷新的时候就会调用,屏幕一秒刷新60次
        CADisplayLink *link = [CADisplayLink displayLinkWithTarget:selfselector:@selector(setNeedsDisplay)];
        
        // 只要把定时器添加到主运行循环就能自动执行
        [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        
        // setNeedsDisplay:底层并不会马上调用drawRect,只会给当前的控件绑定一个刷新的标识,每次屏幕刷新的时候,就会把绑定了刷新(重绘)标识的控件重新刷新(绘制)一次,就会调用drawRect去重绘
        
        // 如果以后每隔一段时间需要重绘,一般不使用NSTimer,使用CADisplayLink,不会刷新的时候有延迟    }
      }
    return self;
}
@end
  • 2.使用DrawView
#import "ViewController.h"
#import "DrawView.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    DrawView *drawV = [[DrawView alloc] init];
    drawV.frame = self.view.frame;
    
    [self.view addSubview:drawV];
}
@end

你可能感兴趣的:(使用CADisplayLink(定时器)实现雪花(Quartz2D))