什么是寄宿圖?
簡(jiǎn)而言之就是圖層(layer)中包含的圖,這個(gè)圖為了我們提供了能夠去設(shè)置或者繪制出我們想要的圖案顯示在iPhone上。
怎么用
1.設(shè)置圖層的contents屬性
CALayer的contents屬性:
@property(nullable, strong) id contents;
contents屬性是一個(gè)id類型,真正的類型是Core Foundation中的CGImageRef,需要__bridge關(guān)鍵字轉(zhuǎn)換,代碼如下:
-(void)viewDidLoad{
[super viewDidLoad];
UIImage *image = [UIImage imageWithName:@"cat"];
self.catView.layer.contents = (__bridge id)image.CGImage;
}
??對(duì)就是這么簡(jiǎn)單,如果不用圖片呢,也很簡(jiǎn)單。
2.實(shí)現(xiàn)-drawRect: 方法自定義繪制
通過(guò)繼承UIView,實(shí)現(xiàn) -drawRect: 方法,用Core Graphics來(lái)自定義繪制。
@implementation CircleView
- (void)drawRect:(CGRect)rect{
// 計(jì)算半徑
CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.5;
//創(chuàng)建圓的路徑
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius];
//設(shè)置draw顏色
[[UIColor redColor] set];
//填充顏色繪制
[bezierPath fill];
}
??對(duì)就是這么簡(jiǎn)單,需要提醒的是 -setNeedsDisplay 會(huì)出發(fā)-drawRect: 及時(shí)更新。另外還有一種自定義繪制方法。
3.實(shí)現(xiàn)CALayerDelegate 協(xié)議自定義繪制
CALayer的delegate屬性:
@property(nullable, weak) id <CALayerDelegate> delegate;
CALayer底層就是通過(guò)CALayerDelegate協(xié)議給外部提供擴(kuò)展繪制、布局、layer action接口,開發(fā)者自行繪制在drawRect提供的寄宿圖上,此時(shí)layer的delegate為UIViewb本身。
====================
CALayerDelegate 協(xié)議
====================
// 用于設(shè)置寄宿圖
- (void)displayLayer:(CALayer *)layer;
// 用于繪制寄宿圖
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
// 將要繪制的時(shí)候調(diào)用
- (void)layerWillDraw:(CALayer *)layerCA_AVAILABLE_STARTING (10.12, 10.0, 10.0, 3.0);
// 繪制方法已經(jīng)調(diào)用,將調(diào)用此方法,bounds變化或setNeetLayout觸發(fā),用于layout sublayer
- (void)layoutSublayersOfLayer:(CALayer *)layer;
// layer action 可以做動(dòng)畫,下次講動(dòng)畫時(shí)user it
- (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;
執(zhí)行順序 layerWillDraw -> displayLayer/drawLayer -> layoutSublayersOfLayer;
代碼如下:
-(void)viewDidLoad{
[super viewDidLoad];
// 設(shè)置初始化
CALayer *blackLayer = [CALayer new];
blackLayer.backgroundColor = [UIColor blackColot].CGColor;
blackLayer.frame = CGRectMake(0,0,100.0f,200.0f);
blackLayer.contentScale = [UIScreen mainScreen].scale;
// 設(shè)置 CALayerDelegate
blackLayer.delegate = self;
// 加入父圖層
[self.view.layer addSublayer:blackLayer];
// 千萬(wàn)不要忘記調(diào)用display,layer層的繪制由開發(fā)者決定,不同于UIView
[blackLayer display];
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
// 畫一個(gè)紅色的橢圓
CGContextSetLineWidth(ctx, 10.0f);
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
??是不是也很簡(jiǎn)單呢,由于水平有限,如果有什么寫的不對(duì)的地方或者需要補(bǔ)充的地方,歡迎指出,也希望自己越寫越好??!