關情紙尾-----Quartz2D-定時器CADisplayLink下雪效果

定時器CADisplayLink下雪效果oop

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.具體實現代碼以下:
spa

 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 }
相關文章
相關標籤/搜索