1. drawRect: UIView子類重寫 2. drawLayer: inContext: CALayer設置代理 (這是個代理方法) 3. drawInContext: CALayer子類重寫 4. 使用圖形上下文生成圖片: imageContext 儘量避免混用 實現 drawRect : ...
1. drawRect:
UIView子類重寫
2. drawLayer: inContext:
CALayer設置代理 (這是個代理方法)
3. drawInContext:
CALayer子類重寫
4. 使用圖形上下文生成圖片:
imageContext
儘量避免混用
-------實現 drawRect : 方法----------
1、使用 UIKit
/** 1、UIView子類實現 drawRect: 方法 2、在 UIKit 提供的當前上下文中繪製 */ - (void)drawRect:(CGRect)rect { // 貝瑟爾路徑描繪橢圓 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 100, 200, 100)]; // 顏色填充 [[UIColor blueColor] setFill]; // 填充到當前上下文 [path fill]; }View Code
效果圖:
2、使用Core Graphic
/** 1、UIView子類實現 drawRect: 方法 2、使用 Core Graphics 獲得當前上下文進行繪製 */ - (void)drawRect:(CGRect)rect { // 獲取當前上下文 CGContextRef context = UIGraphicsGetCurrentContext(); // 繪製圖形 CGContextAddEllipseInRect(context, CGRectMake(100, 100, 200, 100)); // 設置填充顏色 CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); // 渲染 CGContextFillPath(context); }View Code
效果圖:
-----------------------------------------------------------------------------------------------
-------代理實現 drawLayer: inContext: 方法----------
1、使用UIKit
@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; //1.創建自定義的layer CALayer *layer=[CALayer layer]; //2.設置layer的屬性 layer.backgroundColor=[UIColor brownColor].CGColor; layer.bounds=CGRectMake(0, 0, 200, 150); layer.anchorPoint=CGPointZero; layer.position=CGPointMake(100, 100); layer.cornerRadius=20; layer.shadowColor=[UIColor redColor].CGColor; layer.shadowOffset=CGSizeMake(10, 20); layer.shadowOpacity=0.6; //設置代理 layer.delegate=self; // 觸發代理方法進行繪製 [layer setNeedsDisplay]; //3.添加layer [self.view.layer addSublayer:layer]; } -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ // 將引用的上下文轉變成當前上下文。 UIGraphicsPushContext(ctx); // 繪製圖形 UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50,50,100,50)]; [[UIColor blueColor] setFill]; [p fill]; UIGraphicsPopContext(); } @endView Code
效果圖:
2、使用Core Graphic
@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; //1.創建自定義的layer CALayer *layer=[CALayer layer]; //2.設置layer的屬性 layer.backgroundColor=[UIColor brownColor].CGColor; layer.bounds=CGRectMake(0, 0, 200, 150); layer.anchorPoint=CGPointZero; layer.position=CGPointMake(100, 100); layer.cornerRadius=20; layer.shadowColor=[UIColor redColor].CGColor; layer.shadowOffset=CGSizeMake(10, 20); layer.shadowOpacity=0.6; //設置代理 layer.delegate=self; [layer setNeedsDisplay]; //3.添加layer [self.view.layer addSublayer:layer]; } -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ CGContextAddEllipseInRect(ctx, CGRectMake(50,50,100,50)); CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor); CGContextFillPath(ctx); } @endView Code
效果圖:
-----------------------------------------------------------------------------------------------
-------自定義CALayer 重寫 drawInContext:----------
1、使用UIKit
自定義Layer類:
#import "DXLayer.h" #import <UIKit/UIKit.h> @implementation DXLayer //重寫該方法,在該方法內繪製圖形 -(void)drawInContext:(CGContextRef)ctx{ UIGraphicsPushContext(ctx); //1.繪製圖形 UIBezierPath*p =[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50,50,100,50)]; [[UIColor blueColor] setFill]; [p fill]; UIGraphicsPopContext(); } @endView Code
使用:
@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; //1.創建自定義的layer DXLayer *layer=[DXLayer layer]; //2.設置layer的屬性 layer.backgroundColor=[UIColor brownColor].CGColor; layer.bounds=CGRectMake(0, 0, 200, 150); layer.anchorPoint=CGPointZero; layer.position=CGPointMake(100, 100); layer.cornerRadius=20; layer.shadowColor=[UIColor yellowColor].CGColor; layer.shadowOffset=CGSizeMake(5, 5); layer.shadowOpacity=0.6; //3.觸發layer的 drawInContext: 方法 在自定義Layer上進行繪製 [layer setNeedsDisplay]; //4.添加layer [self.view.layer addSublayer:layer]; } @endView Code
效果圖:
2、使用Core Graphic
#import "DXLayer.h" @implementation DXLayer //重寫該方法,在該方法內繪製圖形 -(void)drawInContext:(CGContextRef)ctx{ //1.繪製圖形 //畫一個圓 CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100)); //設置屬性(顏色) // [[UIColor yellowColor]set]; CGContextSetRGBFillColor(ctx, 0, 0, 1, 1); //2.渲染 CGContextFillPath(ctx); } @endView Code
效果圖:
-----------------------------------------------------------------------------------------------
-------使用 Image Context----------
1、通過 ImageContext 生成一個 UIImage對象
2、代碼位置無限制 以上兩種方式都限制在 drawRect: 或 drawLayer: inContext: 方法中
1、使用UIKit
@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 200, 100)]; imgView.image = [self createImageFromImageContext]; [self.view addSubview:imgView]; } /** 通過繪圖的方式 生成圖片對象 (畫個圈圈) */ - (UIImage *) createImageFromImageContext{ /** 創建圖形上下文 1: 所要創建的圖片的尺寸 2: 指定所生成圖片的背景是否為不透明 3: 指定生成圖片的縮放因數,與UIImage的scale屬性所指的含義是一致的。 傳入0則表示讓圖片的縮放因數根據屏幕的解析度而變化 */ UIGraphicsBeginImageContextWithOptions(CGSizeMake(200,100), NO, 0); // UIKit 進行繪圖 UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,200,100)]; [[UIColor blueColor] setFill]; [p fill]; // 從上下文中獲取圖片對象 UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); // 關閉圖形上下文 UIGraphicsEndImageContext(); return img; } @endView Code
效果圖:
2、使用Core Graphic
/** 通過繪圖的方式 生成圖片對象 (畫個圈圈) */ - (UIImage *) createImageFromImageContext{ /** 創建圖形上下文 1: 所要創建的圖片的尺寸 2: 指定所生成圖片的背景是否為不透明 3: 指定生成圖片的縮放因數,與UIImage的scale屬性所指的含義是一致的。 傳入0則表示讓圖片的縮放因數根據屏幕的解析度而變化 */ UIGraphicsBeginImageContextWithOptions(CGSizeMake(200,100), NO, 0); CGContextRef con = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(con, CGRectMake(0,0,200,100)); CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor); CGContextFillPath(con); UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; }View Code
效果圖:
-----------------------------------------------------------------------------------------------