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