iOS:CALayer核心動畫層上繪圖

來源:互聯網
上載者:User

標籤:

在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核心動畫層上繪圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.