1、Custom Drawing
1、給contents賦CGImage的值不是唯一的設(shè)置圖層圖片的方法,也可以直接用Core Graphics直接繪制圖層圖片。能夠通過(guò)繼承UIView并實(shí)現(xiàn) - drawRect: 方法來(lái)自定義繪制。
2、CALayer有一個(gè)可選的delegate屬性,實(shí)現(xiàn)了CALayerDelegate協(xié)議,當(dāng)CALayer需要一個(gè)內(nèi)容特定的信息時(shí),就會(huì)從協(xié)議中請(qǐng)求。CALayerDelegate是一個(gè)非正式協(xié)議,其實(shí)就是說(shuō)沒(méi)有CALayerDelegate @protocol可以讓你在類里面引用,你只需要調(diào)用你想調(diào)用的方法,CALayer會(huì)幫你做剩下的。
3、當(dāng)需要被重繪時(shí),CALayer會(huì)請(qǐng)求它的代理給他一個(gè)寄宿圖來(lái)顯示。它通過(guò)調(diào)用下面這個(gè)方法做到的:- (void)displayLayer:(CALayer *)layer;趁著這個(gè)機(jī)會(huì),如果代理想直接設(shè)置contents屬性的話,它就可以這么做,不然沒(méi)有別的方法可以調(diào)用了。如果代理不實(shí)現(xiàn) - displayLayer: 方法,CALayer就會(huì)轉(zhuǎn)而嘗試調(diào)用下面的這個(gè)方法:- (void)drawLayer:(CALayer *)layer inContent:(CGContextRef)ctx;在調(diào)用這個(gè)方法之前,CALayer創(chuàng)建了一個(gè)合適尺寸的空寄宿圖(尺寸由bounds和contentsScale決定)和一個(gè)Core Graphics的繪制上下文環(huán)境,為繪制寄宿圖做準(zhǔn)備,它作為ctx參數(shù)傳入
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 {
//設(shè)置寬度
CGContextSetLineWidth(ctx, 5.0);
//設(shè)置顏色
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
//設(shè)置rect
// CGContextStrokeRect(ctx, layer.bounds);
CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
效果如下

3、小結(jié)
- 1、盡管我們沒(méi)有用maskToBounds屬性,繪制的那個(gè)圓仍然沿邊界被裁剪了。這是因?yàn)楫?dāng)你使用CALayerDelegate繪制寄宿圖的時(shí)候,并沒(méi)有對(duì)超出邊界外的內(nèi)容提供繪制支持
- 2、當(dāng)使用寄宿畫視圖的圖層的時(shí)候,你也不必實(shí)現(xiàn)- displayLayer: 和- drawLayer:inContext: 方法來(lái)繪制你的寄宿圖。通常做法是實(shí)現(xiàn)UIView的 - drawRect:方法,UIView就會(huì)幫你做完剩下的工作,包括在需要繪制的時(shí)候調(diào)用 - display方法