CALayer05-自定义图层

一、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

时间: 2024-11-10 14:06:48

CALayer05-自定义图层的相关文章

ArcGis for Android中如何获取自定义图层中的图片并旋转

============问题描述============ RT,在GraphicsLayer自定义图层中,有一个图片,现在可以获取到手机的旋转角度,然后根据角度去旋转那个图片.现在只能remove掉GraphicsLayer后旋转图片重新添加到map中,这样的话会非常不连贯,达不到百度地图的旋转效果,请教大神们如何解决? ============解决方案1============ BitmapDrawable bd = new BitmapDrawable(context.getResource

iOS开发——图形编程OC篇&(二)CALayer自定义图层

一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: (1)获取上下文 (2)绘制图形 (3)渲染图形 如果在layer上画东西,与上面的过程类似. 代码示例: 新建一个类,让该类继承自CALayer YYMylayer.m文件 1 // 2 // YYMylayer.m 3 // 05-自定义layer(1) 4 // 5 // Created b

【Core Animation】系列之(一) 自定义图层

UIView的一个重要组成就是CALayer, 我们先创建一个自定义图层 //创建一个图层 CALayer *layer = [CALayer layer]; //设置大小 layer.bounds = CGRectMake(0, 0, 60, 60); //设置位置 layer.position = CGPointMake(100, 200); //设置背景色 layer.backgroundColor = [UIColor blueColor].CGColor; [self.view.lay

【iOS开发-图层】自定义图层的两种方式

想要自定义图层,只需要构建一个类继承CALayer方法 如果让自定义图层初始化上面就有画好的图形,有两种办法 重写drawInContext方法 自定义的图层下面的方法,然后必须自定义的图层对象显示调用 [layer setNeedsDisplay]然后才会调用这个方法; 自定图层文件 - (void)drawInContext:(CGContextRef)ctx { CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);//设置红色 CGContextAddEll

【iOS开发-90】CALayer图层:自定义图层,图层的一些动画

(1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261547 (3)总结 --可以自定义图层,尤其需要对图片进行圆角裁剪. --图层的动画都是假象,其实属性根本没有变化,尽管用如下代码,但也只是强制让图层停留在最后的地方,实际属性还是没有变. anim.fillMode=kCAFillModeForwards; anim.removedOnCompletion=NO; --尽量使用UIView的动画,少用CALayer的动画.

openlayers自定义图层控制的实现

好久没写博文了,今天出来冒个泡. 最近一直在考虑一件事情,那就是openlayers中自定义wms的图层控制.用过openlayers的人都知道,在openlayers中有自带的图层控制的控件,调用方法也很简单: map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':true}));//图层控制 但是,不论是从操作的方便程度还是美观性方面考虑,自带的图层控制是无法满足需求的,考虑了一段时间,今天终于有时间实现了,下面就说

IOS第18天(2,CALayer自定义图层)

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 创建一个图层 CALayer *layer = [CALayer layer]; // 设置尺寸 layer.bounds = CGRectMake(0, 0, 100, 100); // 设置位置 layer.position = CGPointMake(10

自定义图层 注意

calayer=[CALayer layer]; // SCMylayer *layer = [SCMylayer layer]; //2.设置layer的属性 calayer.backgroundColor=[UIColor clearColor].CGColor; calayer.bounds=CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT*0.5); calayer.anchorPoint=CGPointZero; calayer.position

010-CALayer(图层)

问题一:什么是CALayer(图层)? 简而言之:使UIView可以显示在屏幕上的功能属性,UIView之所以可以显示在屏幕上完全是因为UIView内部含有一个CALayer属性 •在iOS中,能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView •UIView本身不具备显示的功能,之所以能显示完全是因为它内部的图层属性(具有显示功能) •在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通