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