1、选择CADisplayLink而不使用NSTimer?
- 如果以后每隔一段时间需要重绘,一般不使用NSTimer,因为NSTimer刷新会有延时,使用CADisplayLink不会刷新的时候有延迟
2、代码实现:
- 自定义视图DrawView
// .h 文件
#import <UIKit/UIKit.h>
@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