美文网首页
Quartz2D简单的实战举例

Quartz2D简单的实战举例

作者: 攻克乃还_ | 来源:发表于2017-11-29 13:22 被阅读1次

一、quartz2D介绍

  • 二维绘图引擎,支持iOS与Mac系统。

二、quartz2D使用场景:

功能很多,着重说以下几个:

2.1.基本图形绘制

  • 注意:只有在 drawRect: 方法当中才能够获取上下文
  • 获取,创建上下文都以UIGraphics开头
/**
 *  方法作用:专门用来绘图
 *  什么时候调用:当View显示的时候调用
 *  @param rect:当View的bounds
 */
- (void)drawRect:(CGRect)rect {
    //1.在drawRect方法当中系统已经帮你创建一个跟View相关联的上下文.(Layer上下文)
    //1.获取上下文
    CGContextRef ctx =  UIGraphicsGetCurrentContext();
    //2.描述路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    //画曲线
    //2.1设置起点
    [path moveToPoint:CGPointMake(50, 280)];
    //2.2添加一根曲线到某一个点
    [path addQuadCurveToPoint:CGPointMake(250, 280) controlPoint:CGPointMake(250, 200)];
    //3.把路径添加到上下文
    CGContextAddPath(ctx, path.CGPath);
    //4.把上下文的内容渲染View上
    CGContextStrokePath(ctx);
}

//画直线
- (void)drawLine{
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //2.绘制路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    //2.1 设置起点
    [path moveToPoint:CGPointMake(50, 280)];
    //2.2 添加一根线到终点
    [path addLineToPoint:CGPointMake(250, 50)];
    //addLineToPoint:把上一条线的终点当作是下一条线的起点
    [path addLineToPoint:CGPointMake(200, 280)];
    //上下文的状态
    //设置线的宽度
    CGContextSetLineWidth(ctx, 10);
    //设置线的连接样式
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    //设置线的顶角样式
    CGContextSetLineCap(ctx, kCGLineCapRound);
    //设置颜色
    [[UIColor redColor] set];
    //3.把绘制的内容添加到上下文当中.
    //UIBezierPath:UIKit框架 ;CGPathRef:CoreGraphics框架
    CGContextAddPath(ctx, path.CGPath);
    //4.把上下文的内容显示到View上(渲染到View的layer)
    CGContextStrokePath(ctx);
}

2.2.给图片添加水印

UIImage *image = [UIImage imageNamed:@"阿狸头像"];
//1.开启一个图片原始大小的上下文
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); //opaque:不透明度
//2.把图片绘制到上下文当中
[image drawAtPoint:CGPointZero];
//3.把文字绘制到上下文当中
NSString *str = @"我爱姗姗";
[str drawAtPoint:CGPointMake(10, 20) withAttributes:nil];
//4.从上下文当中生成一张图片.(把上下文当中绘制的所有内容,生成一张图片)
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//5.关闭上下文.
UIGraphicsEndImageContext();
self.imageV.image = newImage;

2.4.绘制饼图

- (void)drawRect:(CGRect)rect {
    NSArray *dataArray = @[@25,@25,@50];
    CGPoint center =  CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
    CGFloat radius = self.bounds.size.width * 0.5 - 10;
    CGFloat startA = 0;
    CGFloat angle = 0;
    CGFloat endA = 0;
    for (NSNumber *num in dataArray) {
        startA = endA;
        angle = num.intValue / 100.0 * M_PI * 2;
        endA = startA + angle;
        UIBezierPath  *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
        [[self randomColor] set];
        //添加一根线到圆心
        [path addLineToPoint:center];
        [path fill];
    }
}

2.5.绘制文字

- (void)drawText{
    NSString  *str = @"我爱姗姗";
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    //字体大小
    dict[NSFontAttributeName] = [UIFont systemFontOfSize:30];
    //设置颜色
    dict[NSForegroundColorAttributeName] = [UIColor redColor];
    //设置描边
    dict[NSStrokeColorAttributeName] = [UIColor greenColor];
    dict[NSStrokeWidthAttributeName] = @2;
    //设置阴影
    NSShadow *shaw = [[NSShadow alloc] init];
    shaw.shadowColor = [UIColor blueColor];
    //设置阴影的偏移量
    shaw.shadowOffset = CGSizeMake(1, 1);
    shaw.shadowBlurRadius = 2;
    dict[NSShadowAttributeName] = shaw;
    [str drawAtPoint:CGPointZero withAttributes:dict];
    //用drawInRect:rect会自动换行.用drawAtPoint不会自动换行
    //[str drawInRect:rect withAttributes:dict];
}

2.6.剪裁图片

  • [image drawAtPoint:CGPointZero]; 绘制的是原始图片的大小
  • [image drawInRect:rect]; 把要绘制的图片给填充到给定的区域当中.
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed:@"001"];
    //裁剪(超过裁剪区域以外的内容,都会被自动裁剪掉)
    //设置裁剪区域一定要在绘制之前进行设置
    UIRectClip(CGRectMake(0, 0, 50, 50));
    //平铺
    [image drawAsPatternInRect:self.bounds];
}
  • 如果想要自己设定裁剪区域形状,可参照以下干货。
UIImage *image = [UIImage imageNamed:@"美国队长头像"];
//1.开启跟原始图片一样大小的上下文
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
//2.设置一个圆形裁剪区域
//2.1绘制一个圆形
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
//2.2.把圆形的路径设置成裁剪区域
[path addClip];//超过裁剪区域以外的内容都给裁剪掉
//3.把图片绘制到上下文当中(超过裁剪区域以外的内容都给裁剪掉)
[image drawAtPoint:CGPointZero];
//4.从上下文当中取出图片
UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();
//5.关闭上下文
UIGraphicsEndImageContext();
self.imageV.image = newImage;

相关文章

网友评论

      本文标题:Quartz2D简单的实战举例

      本文链接:https://www.haomeiwen.com/subject/xsyubxtx.html