標籤:
在CALayer上繪圖:
•要在CALayer上繪圖,有兩種方法:1.建立一個CALayer的子類,然後覆蓋drawInContext:方法,可以使用Quartz2D API在其中進行繪圖2.設定CALayer的delegate,然後讓delegate實現drawLayer:inContext:方法進行繪圖•注意:–不能再將UIView設定為這個CALayer的delegate,因為UIView對象已經是內部層的delegate,再次設定會出問題–無論使用哪種方法,都必須向層發送setNeedsDisplay訊息,以觸發相應繪圖方法的調用 CALayer、UIView以及上下文之間的關係 :•當UIView收到setNeedsDisplay訊息時,CALayer會準備好一個CGContextRef,然後向它的delegate即UIView,發送訊息,並且傳入已經準備好的CGContextRef對象。UIView在drawLayer:inContext:方法中會調用自己的drawRect:方法•平時在drawRect:中通過UIGraphicsGetCurrentContext()擷取的就是由CALayer傳入的CGContextRef對象,在drawRect:中完成的所有繪圖都會填入CALayer的CGContextRef中,然後被拷貝至螢幕•CALayer的CGContextRef用的是位元影像上下文(Bitmap Graphics Context) 下面我們就對這兩種繪圖方式都進行具體的執行個體示範: 方式一:通過設定CALayer的代理,並實現代理方法drawLayer:inContext:的形式進行繪圖//在-(void)viewDidLoad{[super viewDidLoad];.......}的代碼為:建立子層:
//建立子層(使用預設的錨點) CALayer *subLayer = [[CALayer alloc]init]; subLayer.bounds = CGRectMake(0,0,100, 100); subLayer.position = self.view.center; subLayer.backgroundColor = [[UIColor redColor]CGColor];
//設定圓角半徑,設定為50,此時的子層為圓形 subLayer.cornerRadius = 50; [self.view.layer addSublayer:subLayer];
設定代理
//設定層的代理 subLayer.delegate = self;
發送重繪訊息
//只有發送setNeedsDisplay這個訊息時才會調用代理方法 [subLayer setNeedsDisplay];
//實現代理的drawLayer:inContext:方法代碼為:
#pragma mark -CALayer的代理方法-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ //畫矩形 CGContextAddRect(ctx, CGRectMake(0, 0, 50, 50));
//設定顏色 CGFloat components[4] = {0.0,1.0,0.0,1.0}; CGContextSetStrokeColor(ctx, components);
//這種方式也可以設定顏色 //CGContextSetStrokeColorWithColor(ctx,[[UIColor greenColor]CGColor]);
//旋轉座標系 CGContextScaleCTM(ctx, 1, -1); CGContextTranslateCTM(ctx, 0, -100); //畫笑臉映像 UIImage *image = [UIImage imageNamed:@"1.png"]; CGContextDrawImage(ctx, CGRectMake(0, 0, 100, 100), [image CGImage]); //畫路徑 CGContextDrawPath(ctx, kCGPathStroke);}示範結果如下:在子層中畫了一個笑臉映像,同時左上方畫了一個描綠邊的矩形 方式二:通過建立CALayer的子類,並重寫drawInContext:方法進行繪圖//首先在控制器類的-(void)viewDidLoad{[super viewDidLoad];.......}方法中建立子層的代碼為:
#import "ViewController.h"#import "MyLayer.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //建立子層 MyLayer *myLayer = [[MyLayer alloc]init]; myLayer.bounds = CGRectMake(0, 0, 100, 100); myLayer.position = CGPointMake(100, 100);
//設定子層背景色為灰色 myLayer.backgroundColor = [[UIColor grayColor]CGColor]; [self.view.layer addSublayer:myLayer]; [myLayer setNeedsDisplay];}@end//然後建立一個CALayer的子類,在類中沖重寫drawInContext:方法,代碼如下:
#import "MyLayer.h"#import <UIKit/UIKit.h>@implementation MyLayer//重寫這個方法-(void)drawInContext:(CGContextRef)ctx{ //繪製矩形 CGContextAddRect(ctx, CGRectMake(0, 0, 50, 50)); //第一種設定顏色方式: //設定色彩空間(選擇色彩配置:RGB,紅、綠、藍) CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextSetStrokeColorSpace(ctx, colorspace);
//數組中四個內容:前三個分別為紅綠藍顏色值,後一個為透明度 CGFloat components[4] = {0.0,1.0,0.0,1.0}; CGContextSetStrokeColor(ctx, components); //這是另一種比較簡單的設定顏色的方式 //CGContextSetStrokeColorWithColor(ctx, [[UIColor greenColor]CGColor]); //繪製描邊路徑 CGContextDrawPath(ctx, kCGPathStroke); //釋放create出的屬性,防止記憶體泄露 CGColorSpaceRelease(colorspace);}@end示範結果如下:產生了一個灰色的layer子層,在上面畫了一個只描可綠邊的矩形
iOS:CALayer核心動畫層上繪圖