参考文章:https://bihongbo.com/2016/01/03/memoryGhostdrawRect/#more
http://www.cocoachina.com/ios/20170809/20187.html
https://zsisme.gitbooks.io/ios-/content/chapter2/custom-drawing.html
iOS提供了两套绘图框架,分别是UIBezierPath和Core Graphics。UIBezierPath属于UIKit。UIBezierPath是对Core Graphics框架的进一步封装。
OpenGL和Core Graphics都是绘图专用的API类族,调用图形处理器(GPU)进行图形的绘制和渲染。在架构上是平级的,相比UIkit更接近底层。
CALayer 和 UIView区别
实际上你所看到的视图内容,包括图形等,都是由UIView的一个实例图层属性来绘制和渲染的,那就是CALayer。
CALayer类的概念与UIView非常类似,它也具有树形的层级关系,并且可以包含图片文本、背景色等。它与UIView最大的不同在于它不能响应用户交互,可以说它根本就不知道响应链的存在,它的API虽然提供了“某点是否在图层范围内的方法”,但是它并不具有响应的能力。
在每一个UIView实例当中,都有一个默认的支持图层,UIView负责创建并且管理这个图层。实际上这个CALayer图层才是真正用来在屏幕上显示的,UIView仅仅是对它的一层封装,实现了CALayer的delegate,提供了处理事件交互的具体功能,还有动画底层方法的高级API。可以说CALayer是UIView的内部实现细节。
1.CAShapeLayer +UIBezierPath
-(void)drawMyLayer{
CGSize size=[UIScreen mainScreen].bounds.size;
CGFloatWIDTH =20.0;
CALayer*layer;
CAShapeLayer* brownRectLayer = [CAShapeLayer layer];
brownRectLayer.frame=CGRectMake(0,0,100,100);
UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0,100, 100)];
brownRectLayer.path= path.CGPath;
brownRectLayer.fillColor= [UIColorbrownColor].CGColor;
[self.view.layeraddSublayer:brownRectLayer];
}
效果:
context:图形上下文,可以通过UIGraphicsGetCurrentContext:获取当前视图的上下文
imageContext:图片上下文,可以通过UIGraphicsBeginImageContextWithOptions:获取一个图片上下文,然后绘制完成后,调用UIGraphicsGetImageFromCurrentImageContext获取绘制的图片,最后要记得关闭图片上下文UIGraphicsEndImageContext。
//图片合并
-(UIImage*)createLabel{
//开启图形上下文
NSString*text =@"123456";
UIImage*image = [UIImageimageNamed:@"icon_60pt"];
UIGraphicsBeginImageContextWithOptions(image.size, NO,1.0);
//将图片绘制到
[imagedrawInRect:CGRectMake(0,0,image.size.width, image.size.height)];
NSDictionary*attr =@{
NSFontAttributeName: [UIFontboldSystemFontOfSize:20], //设置字体 NSForegroundColorAttributeName: [UIColorredColor] //设置字体颜色
};
[textdrawAtPoint:CGPointMake(20, 20) withAttributes:attr];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnnewImage;
}
//获得根图层
layer=[[CALayeralloc]init];
//设置背景颜色,由于QuartzCore是跨平台框架,无法直接使用UIColor
layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor;
//设置中心点
layer.position=CGPointMake(size.width/2, size.height/2);
//设置大小
layer.bounds=CGRectMake(0,0, WIDTH,WIDTH);
//设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形
layer.cornerRadius=WIDTH/2;
//设置阴影
layer.shadowColor=[UIColor grayColor].CGColor;
layer.shadowOffset=CGSizeMake(2,2);
layer.shadowOpacity=.9;
//设置边框
// layer.borderColor=[UIColor whiteColor].CGColor;
// layer.borderWidth=1;
//设置锚点
// layer.anchorPoint=CGPointZero;
[self.view.layeraddSublayer:layer];
- (void)drawRect:(CGRect)rect {
//获取图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(ctx,[UIColor redColor].CGColor);
CGContextSetLineWidth(ctx,2.0);
CGContextMoveToPoint(ctx,80,30);
CGContextAddLineToPoint(ctx,80,150);
CGContextStrokePath(ctx);
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextMoveToPoint(ctx,100,30);
CGContextAddLineToPoint(ctx,100,100);
CGContextStrokePath(ctx);
CGContextMoveToPoint(ctx,120,30);
CGContextAddLineToPoint(ctx,120,100);
CGContextStrokePath(ctx);
CGContextMoveToPoint(ctx,150,30);
CGContextAddLineToPoint(ctx,190,30);
CGContextStrokePath(ctx);
//CGContextAddRect(ctx, CGRectMake(0,0,100,100));
CGContextFillRect(ctx, CGRectMake(0,0,1000,1000));
CGContextSetStrokeColorWithColor(ctx,[UIColor redColor].CGColor);;
CGContextStrokePath(ctx);
/*
[[UIColor orangeColor] set];
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineWidth = 2.0;
[path moveToPoint:CGPointMake(80,100)];
[path addLineToPoint:CGPointMake(80,150)];
[path stroke];
UIBezierPath *cirlePaht = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(80-10,150,20,20)];
[[UIColor grayColor]set];
cirlePaht.lineWidth = 5/3;
[cirlePaht stroke];
[cirlePaht fill];
UIBezierPath *paths = [UIBezierPath bezierPath];
paths.lineWidth = 2.0;
[paths moveToPoint:CGPointMake(80,170)];
[paths addLineToPoint:CGPointMake(80,200)];
[paths stroke];
*/
}
- (void)drawRect:(CGRect)rect {
//获取图形上下文
/*
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(ctx,[UIColor redColor].CGColor);
CGContextSetLineWidth(ctx,2.0);
CGContextMoveToPoint(ctx,80,30);
CGContextAddLineToPoint(ctx,80,150);
CGContextStrokePath(ctx);
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextMoveToPoint(ctx,100,30);
CGContextAddLineToPoint(ctx,100,100);
CGContextStrokePath(ctx);
CGContextMoveToPoint(ctx,120,30);
CGContextAddLineToPoint(ctx,120,100);
CGContextStrokePath(ctx);
CGContextMoveToPoint(ctx,150,30);
CGContextAddLineToPoint(ctx,190,30);
CGContextStrokePath(ctx);
//CGContextAddRect(ctx, CGRectMake(0,0,100,100));
CGContextFillRect(ctx, CGRectMake(0,0,100,100));
CGContextSetStrokeColorWithColor(ctx,[UIColor redColor].CGColor);;
CGContextStrokePath(ctx);
*/
[[UIColor orangeColor] set];
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineWidth=2.0;
[pathmoveToPoint:CGPointMake(80,100)];
[path addLineToPoint:CGPointMake(80,150)];
[pathstroke];
UIBezierPath *cirlePaht = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(80-10,150,20,20)];
[[UIColor grayColor]set];
cirlePaht.lineWidth=5/3;
[cirlePahtstroke];
[cirlePahtfill];
UIBezierPath *paths = [UIBezierPath bezierPath];
paths.lineWidth=2.0;
[pathsmoveToPoint:CGPointMake(80,170)];
[paths addLineToPoint:CGPointMake(80,200)];
[pathsstroke];
}