zoukankan      html  css  js  c++  java
  • iOS CALayer应用详解(2)

    参考博客:http://blog.csdn.net/hello_hwc?viewmode=list

    如果你对CALayer 还没有一个清晰的理解,欢迎看一下前面的博客:

    http://www.cnblogs.com/huanying2000/p/6244673.html

    如果你对Layer有一定的了解 请直接看下面的文章

    一 提供CALayer内容的单中方式

    1>把一个图像对象直接赋值给contents属性(这是提供CALayer内容的最好方式)

    2>设置delegate,让代理绘制layer的内容

    3>继承CALayer 重写绘制方法 来提供layer的内容

    由于上面讲了利用contents给layer提供内容 这里就不写了

    http://www.cnblogs.com/huanying2000/p/6244673.html

    通过设置delegate 提供内容

    举例

    使用displayLayer来实现

    @interface ProvideLayerContentsVC()  
    @property (strong,nonatomic)CALayer * sublayer;  
    @property (strong,nonatomic)NSTimer * timer;  
    @property (nonatomic)NSUInteger  randomState;  
    @end  
      
    @implementation ProvideLayerContentsVC  
      
    -(CALayer *)sublayer{  
        if (!_sublayer) {  
            _sublayer = [CALayer layer];  
            _sublayer.position = self.view.center;  
            _sublayer.bounds = CGRectMake(0,0,200,200);  
            [self.view.layer addSublayer:_sublayer];  
        }  
        return _sublayer;  
    }  
    -(NSUInteger)randomState{  
        _randomState = arc4random()%5+1;  
        return _randomState;  
    }  
    -(void)viewWillAppear:(BOOL)animated  
    {  
        self.sublayer.delegate = self;  
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self.sublayer selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];  
    }  
    -(void)displayLayer:(CALayer *)layer  
    {  
        NSString * imageName = [NSString stringWithFormat:@"image%lu.jpg",(unsigned long)self.randomState];  
        layer.contents = (id)[UIImage imageNamed:imageName].CGImage;  
    }  
    @end  

    这段代码的的功能是每隔一秒钟,随机更换layer的图片

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

    -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{  
        CGMutablePathRef path = CGPathCreateMutable();  
        CGPathAddArc(path,NULL,100,100,95,0,M_PI*2, YES);  
        CGContextBeginPath(ctx);  
        CGContextAddPath(ctx,path);  
        CGContextSetLineWidth(ctx, 5);  
        CGContextStrokePath(ctx);  
        CFRelease(path);  
    }  

    二 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的对应关系如下图

  • 相关阅读:
    P2176 [USACO14FEB]路障Roadblock
    【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
    图论其一:图的存储
    【计算几何】二维凸包——Graham's Scan法
    P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
    P2639 [USACO09OCT]Bessie的体重问题 【背包问题】
    如何评价代码质量的高低
    乔新亮-衡量企业 IT 团队价值的唯一指标是什么
    我总结了平台的5道坎
    hadoop namenode的工作机制
  • 原文地址:https://www.cnblogs.com/huanying2000/p/6244735.html
Copyright © 2011-2022 走看看