定时器雪花效果
#####1.定时器一个是NSTimer
#import "HYLSnowflake.h"
static CGFloat snowY=0;
@implementation HYLSnowflake
#pragma mark -drawRect
- (void)drawRect:(CGRect)rect {
UIImage *image=[UIImage imageNamed:@"雪花"];
[image drawAtPoint:CGPointMake(0, snowY)];
}
-(void)awakeFromNib{
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
}
-(void) timeChange{
snowY+=10;
if (snowY>self.bounds.size.height) {
snowY=0;
}
[self setNeedsDisplay];
}
@end
#####2.另一个是CADisplayLink
@implementation HYLSnowflake
#pragma mark -drawRect
- (void)drawRect:(CGRect)rect {
UIImage *image=[UIImage imageNamed:@"雪花"];
[image drawAtPoint:CGPointMake(0, snowY)];
}
//-(void)awakeFromNib{
// [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
//
//}
#pragma mark - awakeFromNib
-(void) awakeFromNib{
//屏幕刷新时调用,屏幕一般一秒刷新60次
CADisplayLink *link=[CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
-(void) timeChange{
if (count==30) {
snowY+=10;
count=0;
}else{
count++;
}
if (snowY>self.bounds.size.height) {
snowY=0;
}
//注意:这个方法并不会马上调用drawRect,其实这个方法只是给当前控件添加刷新的标记,等下一次屏幕刷新的时候才会调用drawRect
[self setNeedsDisplay];
}
@end
- NSTimer易出现卡顿情况
- 第二种不会,因为频率与屏幕刷新时间相同,所以不会出现卡顿
#####4.效果图片
- 1.
#####5.源代码地址