iOS定时器雪花效果

定时器雪花效果

#####1.定时器一个是NSTimergit

#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.另外一个是CADisplayLinkgithub

@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.效果图片oop

  • 1.

#####5.源代码地址.net

相关文章
相关标签/搜索