ios--绘图介绍
2015-08-09 13:22
344 查看
iOS–绘图介绍
绘制图像的三种方式
一. 子类化UIView,在drawRect:方法画图
执行方法时,系统会自行创建画布(CGContext),并且讲画布推到堆栈的栈顶位置执行完毕后,系统会执行pop出这个画布。
- (void)drawRect:(CGRect)rect{ CGContextRef con = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100)); CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor); CGContextFillPath(con); }
二. 直接UIGraphicsBeginImageContextWithOptions绘图
UIGraphicsBeginImageContextWithOptions (CGSize size,
BOOL opaque,
CGFloat scale
);
参数:size–画布大小
参数:opaque–不透明
参数:scale–放大比例,设置为0,表示和屏幕自适应。(此参数和image中的scale是一样的)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0); UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)]; [[UIColor blueColor] setFill]; [p fill]; UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *imgView = [[UIImageView alloc]initWithImage:im]; imgView.frame = CGRectMake(100, 100, im.size.width, im.size.height); [self.view addSubview:imgView];
三. layer.delegate代理绘制图片
UIView子类的drawLayer:inContext:方法中实现绘图任务。drawLayer:inContext:方法是一个绘制图层内容的代理方法。为了能够调用drawLayer:inContext:方法,我们需要设定图层的代理对象。注意点:
1. drawLayer:inContext:代理方法需要写在UIView子类中,如果写在UIViewController中会出现内存过度释放问题。
2. 不应该将UIView对象设置为显示层的委托对象,这是因为UIView对象已经是隐式层的代理对象,再将它设置为另一个层的委托对象就会出问题。
下面是实现代码的声明和实现文件
@interface LayerDelegate : NSObject @end @interface LayerDelegateView : UIView @end
@implementation LayerDelegate - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ //1.绘制图形 //画一个圆 CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 100, 100)); //设置属性(颜色) CGContextSetRGBFillColor(ctx, 0, 0, 1, 1); //2.渲染 CGContextFillPath(ctx); } @end @interface LayerDelegateView () @property (strong, nonatomic) LayerDelegate *delegate; @end @implementation LayerDelegateView - (void)drawRect:(CGRect)rect { // Drawing code } - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { CALayer *myLayer = [CALayer layer]; self.delegate = [[LayerDelegate alloc]init]; myLayer.delegate = self.delegate; myLayer.backgroundColor = [UIColor brownColor].CGColor; myLayer.bounds = CGRectMake(0, 0, 200, 150); myLayer.anchorPoint = CGPointZero; myLayer.position = CGPointMake(100, 100); myLayer.cornerRadius = 20; myLayer.shadowColor = [UIColor blackColor].CGColor; myLayer.shadowOffset = CGSizeMake(10, 20); myLayer.shadowOpacity = 0.6; [myLayer setNeedsDisplay]; // 调用此方法,drawLayer: inContext:方法才会被调用。 [self.layer addSublayer:myLayer]; } return self; } @end
绘图CGContext堆栈介绍
CGContext被存放在系统的一个绘图上下文堆栈区中,我们编辑CGContext的时候,可以将CGContext push到栈顶,然后在编辑完成时,将GContext pop出栈顶。下面的代码简单介绍了其使用。UIImage *img1; UIImage *img2; //在绘图上下文1中绘图 UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0); [@"第一个" drawInRect:CGRectMake(10, 20, 80, 20) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}]; img1 = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsPushContext(UIGraphicsGetCurrentContext()); UIGraphicsEndImageContext();//!!!: 这个等等删掉试试看 //跳转到绘图上下文2中绘图 UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0); [@"第二个" drawInRect:CGRectMake(10, 20, 80, 20) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}]; img2 = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //pop返回到绘图上下文1中绘图 UIGraphicsPopContext(); [@"再第一个" drawInRect:CGRectMake(110, 20, 80, 20) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}]; img1 = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsPushContext(UIGraphicsGetCurrentContext()); UIGraphicsEndImageContext(); //pop返回到绘图上下文1中绘图 UIGraphicsPopContext(); [@"再再第一个" drawInRect:CGRectMake(10, 40, 80, 20) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}]; img1 = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //绘图上下文1和绘画上下文2中的图片显示出来 UIImageView *imgView1 = [[UIImageView alloc]initWithImage:img1]; imgView1.frame = CGRectMake(0, 100, 200, 100); imgView1.backgroundColor = [UIColor yellowColor]; [self.view addSubview:imgView1]; UIImageView *imgView2 = [[UIImageView alloc]initWithImage:img2]; imgView2.frame = CGRectMake(0, 300, 200, 100); imgView2.backgroundColor = [UIColor redColor]; [self.view addSubview:imgView2];
参考文章
iOS绘图教程iOS绘图实际例子讲解
相关文章推荐
- IOS版本-两个小球不停的绕中心旋转的进度条
- IOS第四节:OC中的内存管理机制
- ChibiOS/RT 2.6.9 CAN Low Level Driver for STM32
- iOS Assertion failure in [MyClass layoutSublayersOfLayer:]
- ChibiOS/RT 2.6.9 CAN Driver
- iOS开发多线程-多线程技术1
- 【iOS】iOS的iTunes文件共享,在程序Document路径
- iOS中的事件传递和响应者链条
- IOS学习之蓝牙4.0 BLE
- iOS设计模式之工厂方法模式
- iOS设计模式之简单工厂模式
- iOS错误 - too many open files (error = 24)
- 教你提前体验iOS9 iOS9公开测试版升级教程
- 我的BIOS之行(3)-遍历pci设备(2)mmio访问
- iOS程序内打开和发送邮件
- iOS开发-Launch Image和Launch Screen
- IOS开发基础篇--NSNotificationCenter使用小结
- IOS开发之NSString的使用大全
- iOS Core Animation详解(五)CATransition
- 运行时Runtime 小结