IOS SDK详解之CALayer(二)

3 篇文章 0 订阅
2 篇文章 0 订阅

不了解CALayer基础的同学,建议先看看前一篇CALayer详解(一)

转载于:http://blog.csdn.net/hello_hwc/article/details/42580773

前言:本文涵盖了(1)绘制CALayer的三种方式(2)Layer Tree

一 提供CALayer内容的三种方式

  • 把一个图像对象直接赋值给contents属性(这是提供CALayer内容的最好方式)
  • 设置delegate,让代理绘制layer的内容
  • 继承CALayer,重写绘制方法,来提供layer的内容
1.1 把一个图像对象直接赋值给contents属性
  这个在上一篇文章里讲的很详细,具体见上一篇文章

1.2 设置delegate
当layer中的内容是需要动态改变的时候,可以使用delegate来实现
两个代理方法:
  • displayLayer:如果代理实现了这个方法,那么要绘制一个bitmap,然后赋值给contents属性
  • drawLayer:inContext:如果代理实现了这个方法,Core Animation提供一个context来生成bitmap,你所做的只是把想要的内容绘制到context
注意:代理必须至少实现两个代理方法其中的一个,如果都实现,则调用displayLayer:
举例:
使用displayLayer来实现
[objc]  view plain copy
  1. @interface ProvideLayerContentsVC()  
  2. @property (strong,nonatomic)CALayer * sublayer;  
  3. @property (strong,nonatomic)NSTimer * timer;  
  4. @property (nonatomic)NSUInteger  randomState;  
  5. @end  
  6.   
  7. @implementation ProvideLayerContentsVC  
  8.   
  9. -(CALayer *)sublayer{  
  10.     if (!_sublayer) {  
  11.         _sublayer = [CALayer layer];  
  12.         _sublayer.position = self.view.center;  
  13.         _sublayer.bounds = CGRectMake(0,0,200,200);  
  14.         [self.view.layer addSublayer:_sublayer];  
  15.     }  
  16.     return _sublayer;  
  17. }  
  18. -(NSUInteger)randomState{  
  19.     _randomState = arc4random()%5+1;  
  20.     return _randomState;  
  21. }  
  22. -(void)viewWillAppear:(BOOL)animated  
  23. {  
  24.     self.sublayer.delegate = self;  
  25.     self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self.sublayer selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];  
  26. }  
  27. -(void)displayLayer:(CALayer *)layer  
  28. {  
  29.     NSString * imageName = [NSString stringWithFormat:@"image%lu.jpg",(unsigned long)self.randomState];  
  30.     layer.contents = (id)[UIImage imageNamed:imageName].CGImage;  
  31. }  
  32. @end  
这段代码的的功能是每隔一秒钟,随机更换layer的图片。效果如下
                                             

使用draw:inContext实现自定义重新绘制

[objc]  view plain copy
  1. -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{  
  2.     CGMutablePathRef path = CGPathCreateMutable();  
  3.     CGPathAddArc(path,NULL,100,100,95,0,M_PI*2YES);  
  4.     CGContextBeginPath(ctx);  
  5.     CGContextAddPath(ctx,path);  
  6.     CGContextSetLineWidth(ctx, 5);  
  7.     CGContextStrokePath(ctx);  
  8.     CFRelease(path);  
  9. }  
效果如下




二 Layer Tree
Layer Tree分为三种, Model Layer Tree,Presentation Tree,Render Tree
其中,Render Tree为CoreAnimation私有的,是CoreAnimation具体实现使用的私有Tree,这里不做讨论。
Model Layer Tree:存储的是模态对象,也是我们通常处理的对象,比如layer.position = CGPointMake(10.0,10.0)修改的就是Model Layer Tree
Presentation Tree:存储的是正在执行的动画的当前状态,是个动态的树,由这个树来获取当前动画运行到哪里。
这两点对后续Core Animation的深入理解很重要。
上述三种Tree的对应关系如下图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值