iOS 中绘图的几种方法

参考文章: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];

}

效果:

1550872-fd7d859ba12426ae.png
UIGraphicsBeginImageContextWithOptions使用图片上下文

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;

}


1550872-5a6189c8e4cc3618.png
单纯使用CaLayer

 //获得根图层

    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];



1550872-bfb67f46e6dfb235.png
CGContextRef

- (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];

    */

}


1550872-8f3718b95baaa33e.png
单纯UIBezierPath

- (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];

}


1550872-39dd72b84d2c85dc.png

猜你喜欢

转载自blog.csdn.net/weixin_34406796/article/details/87142596
今日推荐