CALayer寄宿圖

什么是寄宿圖?

簡(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ǔ)充的地方,歡迎指出,也希望自己越寫越好??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容