iOS Qurt2D 绘图详解

绘图

1.Quartz 2D ApI 可以实现许多功能,如基于路径的绘图、透明度哦、阴影、颜色管理、反锯齿、PDF文档生成和数据访问;

2.Quartz 2D ApI 是Core  Graphics框架(在导入<UIKit/UIKit.h>已经导入了)的部分,因此其中的很多数据类型和方法都是以CG开头;  

3.Quartz 2D 与分辨率 和设备无关,因此在使用Quartz 2D 画图时,无需考虑最终绘图的目标设备;

4.Quartz 2D 的坐标系统的原点(0 ,0)在左下角;有些技术在设置他们的图形上下问的时候,使用了不同于Quartz的默认坐标系统。例如 :UIView中的UIGraphicsGetCurrentContext方法返回的图形上下文就是用的是原点位于左上角的坐标系;以UI开头的方法获取到的,在绘图时无需进行坐标转换(都是以左上角开始的);

5.使用含有“Creact”或“copy”的函数创建的对象,使用完后必须释放,否则会内存泄露;


6.UIView重新绘图的时候应该调用setNeedsDisplay,而不能直接调用drawRect;

——————————————绘制图形
1.//自定义绘制图形,调用drawRect方法
- ( void )drawRect:( CGRect )rect{

      //在这个方法中需要拿到图形的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
  //然后调用下面的方法
}
#pragma mark - 绘制线条
- (void)drawLine:(CGContextRef)context
{
    //1.获取上下文
    //context
   
    //2.创建绘制的路径(path)
    //路径
    //CGPathRef 不可变
    //CGMutablePathRef 可变路径
    CGMutablePathRef path = CGPathCreateMutable();
   
    //设置起始点
    CGPathMoveToPoint(path, NULL, 50, 50);
   
    //连线到下一点
    CGPathAddLineToPoint(path, NULL, 200, 200);
    CGPathAddLineToPoint(path, NULL, 50, 200);
   
    //关闭路径
    CGPathCloseSubpath(path);
   
    //3.把路径添加到上下文中
    CGContextAddPath(context, path);
   
    //4.设置上下文的属性
    //线条的颜色
    CGContextSetRGBStrokeColor(context, 41/255.0, 110/255.0, 222/255.0, 1);
    //填充的颜色
    CGContextSetRGBFillColor(context, 150/255.0, 50/255.0, 100/255.0, 1);
   
    //线条宽度
    CGContextSetLineWidth(context, 5);
   
    //连接点的样式
    CGContextSetLineJoin(context, kCGLineJoinRound);
   
    //5.绘制路径
    /*
     kCGPathFill,   //只填充
     kCGPathEOFill, //异或
     kCGPathStroke, //只画线
     kCGPathFillStroke,     //填充和画线
     kCGPathEOFillStroke
     */
    CGContextDrawPath(context, kCGPathFillStroke);
   
    //6.释放路径
    CGPathRelease(path);
   
}

划线的第二种方法
- (void)drawLine2:(CGContextRef)context
{
    //设置点
    CGPoint p1 = CGPointMake(50, 50);
    CGPoint p2 = CGPointMake(200, 150);
    CGPoint p3 = CGPointMake(50, 100);
   
//    int i[2] = {}
    CGPoint points[] = {p1, p2, p3};
   
    //把点直接在上下文上连线
    CGContextAddLines(context, points, 3);
   
    //UIKit封装的设置颜色的方法
    [[UIColor redColor] setStroke];
    [[UIColor blueColor] setFill];
   
    [[UIColor whiteColor] set];
   
   
    //绘制图形
    CGContextDrawPath(context, kCGPathFillStroke);
   
}
#pragma mark - 绘制矩形
- (void)drawShapeRect:(CGContextRef)context
{
    //方法一
    /*
    //设置绘制的区域
    CGRect rect = CGRectMake(40, 40, 100, 200);
   
    //设置区域添加到上下文
    CGContextAddRect(context, rect);
   
    //UIKit封装的设置颜色的方法
    [[UIColor redColor] setStroke];
    [[UIColor blueColor] setFill];
   
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
     */
    //方法二
    //UIKit
    CGRect rect = CGRectMake(40, 40, 100, 200);
   
    [[UIColor redColor] setStroke];
    [[UIColor blueColor] setFill];
   
    //调用,直接开始绘图
    UIRectFill(rect);   //填充
    UIRectFrame(rect);  //框架
 
}

#pragma mark - 绘制圆形
- (void)drawCircle:(CGContextRef)context
{
    //圆
    /*
     * x,y     圆心
     * radius  半径
     * startAngle endAngle  起始和结束的角度(单位 弧度)
     * clockwise  顺时针 0 / 逆时针 1
     */
    //CGContextAddArc(context, 160, 200, 50, 0, M_PI_2, 1);
   
    //内切圆
    CGRect rect = CGRectMake(50, 50, 200, 100);
    [[UIColor orangeColor] setStroke];
    UIRectFrame(rect);
   
    CGContextAddEllipseInRect(context, CGRectMake(50, 50, 200, 100));
   
    [[UIColor redColor] setStroke];
    [[UIColor brownColor] setFill];
   
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark - 贝塞尔曲线
- (void)drawCurve:(CGContextRef)context
{
    //起始点
    CGContextMoveToPoint(context, 20, 50);
   
    /*
     * 1x, 1y 第一条切线的终点
     * 2x, 2y 第二条切线的起始点
     * x, y 第二条切线的终点
     */
//    CGContextAddCurveToPoint(context, 100, 20, 200, 300, 300, 50);
   
    CGContextAddQuadCurveToPoint(context, 160, 20, 300, 200);
   
    CGContextDrawPath(context, kCGPathStroke);

}

#pragma mark - 绘制文本
- (void)drawText:(CGContextRef)context
{
    //1.绘制的文字
    NSString *str = @"wxhl34";
   
    //2.定义绘制的区域
    CGRect rect = CGRectMake(50, 50, 200, 50);
   
    UIRectFrame(rect);
   
    //3.设置绘制的样式
    //文本段落的样式
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
    //断行方式
    style.lineBreakMode = NSLineBreakByCharWrapping;
    style.alignment = NSTextAlignmentRight;
   
    NSDictionary *attr = @{
                           NSFontAttributeName:[UIFont systemFontOfSize:20],
                           NSParagraphStyleAttributeName:style
                           };
   
   
    //4.绘制
    [str drawInRect:rect withAttributes:attr];
}
#pragma mark - 绘制图片
- (void)drawImage:(CGContextRef)context
{
    //图片
    UIImage *image = [UIImage imageNamed:@"baymax.jpg"];
   
    //1.以指定点为起点绘制
    [image drawAtPoint:CGPointMake(20, 400)];
   
    //2.在指定区域绘制,会自动拉伸
    //[image drawInRect:CGRectMake(0, 0, 100, 200)];

   
    //坐标系转换
    //CG   UIKit
    //保存当前的上下文
    CGContextSaveGState(context);
   
    //CGContextTranslateCTM(context, 0, 200);
    //y轴取反
    CGContextScaleCTM(context, 1, -1);
    //y轴上移200
    CGContextTranslateCTM(context, 0, -200);
   
   
    /*
    CGContextRotateCTM(context, M_PI);      //旋转
    CGContextScaleCTM(context, -1, 1);      //缩放
    CGContextTranslateCTM(context, 0, -200);    //平移
     */
   
    //CG
    //UIImage --> CGImageRef
    //UIKit       Core Graphics     AppKit
    CGContextDrawImage(context, CGRectMake(0, 0, 320, 200), image.CGImage);
   
    //恢复之前保存的上下文
    CGContextRestoreGState(context);
}

//设置水印的demo

- (UIImage *)watermarkImageWithText:(NSString *)text
{
    //1.取到上下文
    UIGraphicsBeginImageContext(self.size);
   
    //2.绘制图片
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
   
    //3.绘制水印文字
    CGRect textRect = CGRectMake(0, self.size.height - 30, self.size.width, 30);
   
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
    style.alignment = NSTextAlignmentCenter;
   
    NSDictionary *attr = @{
                           NSFontAttributeName: [UIFont boldSystemFontOfSize:25],
                           NSParagraphStyleAttributeName: style,
                           NSForegroundColorAttributeName: [UIColor whiteColor]
                           };
//    [[UIColor whiteColor] set];
    [text drawInRect:textRect withAttributes:attr];
   
    //4.获取到绘制完成的图片
    UIImage *watermarkedImage = UIGraphicsGetImageFromCurrentImageContext();
   
    //5.结束在图片上的绘制
    UIGraphicsEndImageContext();
   
    return watermarkedImage;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值