002-Custom Drawing

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);
}

效果如下

QQ20161221-2@2x.png

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方法
最后編輯于
?著作權(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)容

  • 本文轉(zhuǎn)載自:http://www.cocoachina.com/ios/20150104/10814.html ...
    idiot_lin閱讀 1,678評(píng)論 0 11
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,686評(píng)論 6 30
  • ** 圖層樹(shù)、寄宿圖以及圖層幾何學(xué)(一)圖層的樹(shù)狀結(jié)構(gòu)**巨妖有圖層,洋蔥也有圖層,你有嗎?我們都有圖層 -...
    樹(shù)根曰閱讀 906評(píng)論 0 8
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,260評(píng)論 5 13
  • Core Animation其實(shí)是一個(gè)令人誤解的命名。你可能認(rèn)為它只是用來(lái)做動(dòng)畫的,但實(shí)際上它是從一個(gè)叫做Laye...
    小貓仔閱讀 3,950評(píng)論 1 4

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