码迷,mamicode.com
首页 > 其他好文 > 详细

CALayer05-自定义图层

时间:2015-05-13 21:31:45      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

一、UIView和CALayer的其他关系

* UIView可以通过subviews属性访问所有的子视图,类似地,CALayer也可以通过sublayers属性访问所有的子层

* UIView可以通过superview属性访问父视图,类似地,CALayer也可以通过superlayer属性访问父层

如果两个UIView是父子关系,那么它们内部的CALayer也是父子关系。

二、自定义图层方法一

1、方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图

 技术分享

2.在.m文件中覆盖drawInContext:方法,在里面绘图

只有明显地调用setNeedsDisplay方法,才会调用drawInContext:方法进行绘制
-(void)drawInContext:(CGContextRef)ctx//上下文
{
    //颜色,在这边使用UIColor是没有用的,CALayer是QuartzCore框架的,所有UI的东西是没有用的在这边
    CGContextSetRGBFillColor(ctx, 1.0, 0, 1.0, 1);
    
    //画圆
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));
    
    //渲染,直接实心绘制
    CGContextFillPath(ctx);
}

3、viewDidLoad方法中调用

    CustomLayer *layer = [CustomLayer layer];
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.backgroundColor = [UIColor blueColor].CGColor;
    layer.anchorPoint = CGPointZero;
    //图层和view不一样,layer不会自动的调用drawInContext:,只有明显地调用setNeedsDisplay方法,才会调用drawInContext:方法进行绘制
    [layer setNeedsDisplay];
    
    [self.view.layer addSublayer:layer];

三、自定义view来绘制,与上面的自定义layer进行对比

技术分享

//UIView绘制图形的drawRect:
-(void)drawRect:(CGRect)rect
{
    //需要主动拿图层上下文,然后在上下文中绘制图片
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //填充色
    CGContextSetRGBFillColor(ctx, 1.0, 0, 1.0, 1);
    
    //画圆
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50));
    
    //渲染,直接实心绘制
    CGContextFillPath(ctx);
    
    //上面所绘制的东西相当于下面这个语句,图形上下文中绘制的所有的东西传到图层中去了
    //UIView能够显示,主要是layer,这里拿到的上下文就是图层方法-(void)drawInContext:(CGContextRef)ctx中传人的上下文
//    [self.layer drawInContext:ctx];
}

四、自定义图层方法二,不需要自定义,不需要继承,通过代理进行绘制

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self diyLayer2];
}

#pragma make - 创建图层方法二
- (void)diyLayer2
{
    CALayer *layer = [CALayer layer];
    layer.bounds = CGRectMake(0, 0, 100, 100);
    layer.backgroundColor = [UIColor blueColor].CGColor;
    layer.anchorPoint = CGPointZero;
    layer.position = CGPointMake(100, 100);
    //如果代理方法没有协议,说明任何对象都可以当它的代理,代表这个方法是NSObject对象的。进去看一下,是NSObject分类方法。
    //一个view内部自带的图层的代理,默认就是view本身,不可以修改自带layer的代理
    layer.delegate = self;
    //图层需要主动的调用绘制方法
    [layer setNeedsDisplay];
    [self.view.layer addSublayer:layer];
}

#pragma make - 图层的代理方法
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
    CGContextAddRect(ctx, CGRectMake(0, 0, 20, 20));
    CGContextFillPath(ctx);
}
五、view根层的layer的代理就是view本身,view内部那个图层怎么会东西由view决定,view实现drawRect:

 

    //view根层的layer的代理就是view本身
    self.view.layer.delegate == self.view

19fenzhong

 

CALayer05-自定义图层

标签:

原文地址:http://www.cnblogs.com/yipingios/p/4501460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!