美文网首页
002-Custom Drawing

002-Custom Drawing

作者: 紫荆秋雪_文 | 来源:发表于2016-12-21 15:28 被阅读52次

    1、Custom Drawing

    • 1、给contents赋CGImage的值不是唯一的设置图层图片的方法,也可以直接用Core Graphics直接绘制图层图片。能够通过继承UIView并实现 - drawRect: 方法来自定义绘制。

    • 2、CALayer有一个可选的delegate属性,实现了CALayerDelegate协议,当CALayer需要一个内容特定的信息时,就会从协议中请求。CALayerDelegate是一个非正式协议,其实就是说没有CALayerDelegate @protocol可以让你在类里面引用,你只需要调用你想调用的方法,CALayer会帮你做剩下的。

    • 3、当需要被重绘时,CALayer会请求它的代理给他一个寄宿图来显示。它通过调用下面这个方法做到的:- (void)displayLayer:(CALayer *)layer;趁着这个机会,如果代理想直接设置contents属性的话,它就可以这么做,不然没有别的方法可以调用了。如果代理不实现 - displayLayer: 方法,CALayer就会转而尝试调用下面的这个方法:- (void)drawLayer:(CALayer *)layer inContent:(CGContextRef)ctx;在调用这个方法之前,CALayer创建了一个合适尺寸的空寄宿图(尺寸由bounds和contentsScale决定)和一个Core Graphics的绘制上下文环境,为绘制寄宿图做准备,它作为ctx参数传入

    2、示例如下

    #import "ViewController.h"
    //#import <QuartzCore/QuartzCore.h>
    
    @interface ViewController ()<CALayerDelegate>
    /**
     *  layerView
     */
    @property (nonatomic, strong) UIView *layerView;
    
    /**
     *  blueLayer
     */
    @property (nonatomic, strong) CALayer *blueLayer;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 背景颜色
        self.view.backgroundColor = [UIColor darkGrayColor];
        // View
        self.layerView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
        self.layerView.backgroundColor = [UIColor whiteColor];
        [self.view addSubview:self.layerView];
        //blueLayer
        self.blueLayer = [CALayer layer];
        self.blueLayer.frame = CGRectMake(50, 50, 100, 100);
        self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;
        self.blueLayer.contentsScale = [UIScreen mainScreen].scale;
        self.blueLayer.delegate = self;
        [self.layerView.layer addSublayer:self.blueLayer];
        [self.blueLayer display];
    }
    
    - (void)drawLayer:(CALayer *)layer inContext:(nonnull CGContextRef)ctx {
        //设置宽度
        CGContextSetLineWidth(ctx, 5.0);
        //设置颜色
        CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
        //设置rect
    //    CGContextStrokeRect(ctx, layer.bounds);
        CGContextStrokeEllipseInRect(ctx, layer.bounds);
    }
    

    效果如下

    QQ20161221-2@2x.png

    3、小结

    • 1、尽管我们没有用maskToBounds属性,绘制的那个圆仍然沿边界被裁剪了。这是因为当你使用CALayerDelegate绘制寄宿图的时候,并没有对超出边界外的内容提供绘制支持
    • 2、当使用寄宿画视图的图层的时候,你也不必实现- displayLayer: 和- drawLayer:inContext: 方法来绘制你的寄宿图。通常做法是实现UIView的 - drawRect:方法,UIView就会帮你做完剩下的工作,包括在需要绘制的时候调用 - display方法

    相关文章

      网友评论

          本文标题:002-Custom Drawing

          本文链接:https://www.haomeiwen.com/subject/uayqvttx.html