Quartz 2D学习笔记

版权声明:本文为博主原创文章,如若转载请注明博客来源以及地址,多谢 https://blog.csdn.net/xiaoluodecai/article/details/50773962

1.Quartz 2D学习笔记
学习技巧:

(1)画出一条简单的线:

//当视图显示的时候会调用,默认只会调用一次
- (void)drawRect:(CGRect)rect {
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.设置绘图信息(拼接路径)
    UIBezierPath *path = [UIBezierPath bezierPath];

    //3.设置起点
    [path moveToPoint:CGPointMake(10, 10)];

    //4.添加一条线到某个点
    [path addLineToPoint:CGPointMake(125, 125)];
//    [path addLineToPoint:CGPointMake(240, 10)];
    //5.将路径添加到上下文
    //path.CGPath 能够将UIKit的路径转换成CoreGraphics,只要是CG开头就可以
    CGContextAddPath(ctx, path.CGPath);

    //6.把上下文渲染到视图
    //stroke描边
    CGContextStrokePath(ctx);



}

(2)注意,

    [path addLineToPoint:CGPointMake(125, 125)];

添加了一条线后,这条线的终点将成为下一条线的起点;
(3)
设置线条的属性:

    CGContextAddPath(ctx, path.CGPath);

    //设置绘图状态
    //设置线宽
    CGContextSetLineWidth(ctx, 10);

    //设置线的样式
    CGContextSetLineCap(ctx, kCGLineJoinRound);

    //设置颜色
//    CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);//通过RGB来设置
    [[UIColor redColor] set];//较简便的方法

    CGContextStrokePath(ctx);

(4)
画一条曲线:

    //1、获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.拼接路径
    UIBezierPath *path  = [UIBezierPath bezierPath];

    CGPoint startp = CGPointMake(10, 125);
    CGPoint endp = CGPointMake(240, 125);
    CGPoint controlp = CGPointMake(10, 10);

    [path moveToPoint:startp];
    //3.
    [path addQuadCurveToPoint:endp controlPoint:controlp];

    //
    CGContextAddPath(ctx, path.CGPath);

    CGContextStrokePath(ctx);

参考网址:http://donbe.blog.163.com/blog/static/138048021201052093633776/

(5)
画一个三角形:

- (void)drawRect:(CGRect)rect {
    // Drawing code
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.拼接路径
    UIBezierPath *path = [UIBezierPath bezierPath];

    CGPoint startP = CGPointMake(10, 10);
    [path moveToPoint:startP];

    [path addLineToPoint:CGPointMake(125, 125)];

    [path addLineToPoint:CGPointMake(240, 10)];

//    [path addLineToPoint:startP];//指向起点,则形成回路
    [path closePath];//关闭路径,自动从上一个的终点指向最初的起点

    //3.把路径添加到上下文
    CGContextAddPath(ctx, path.CGPath);

    //设置属性
    [[UIColor blueColor] setFill];//设置里面的填充
    [[UIColor redColor] setStroke];//设置线框的颜色

    CGContextSetLineWidth(ctx, 15);//这句对于(1)(2)两句是无效的,只对(3)有效

    //4.渲染上下文
//    CGContextStrokePath(ctx);//只是将线连接起来(1)
//    CGContextFillPath(ctx);//填充包括里面内容,是黑色的(2)

    //既填充又描边 kCGPathFillStroke
    CGContextDrawPath(ctx, kCGPathFillStroke);//(3)


}

效果图:
这里写图片描述

(3)画矩形:

-(void)drawjuxing
{
    // Drawing code
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.拼接路径
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 250, 250)];//画矩形

    path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 10, 200, 200) cornerRadius:100];//画圆

    //3.把路径添加到上下文
    CGContextAddPath(ctx, path.CGPath);

    //4.渲染上下文
    CGContextStrokePath(ctx);//只是将线连接起来(1)
    //    CGContextFillPath(ctx);//填充包括里面内容,是黑色的(2)

    //既填充又描边 kCGPathFillStroke
    //    CGContextDrawPath(ctx, kCGPathFillStroke);//(3)
}

(3)
画圆弧以及填充圆

-(void)drwatianchongyuan
{
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.拼接路径
    CGPoint center = CGPointMake(125, 125);//圆心
    CGFloat radius = 100;//半径
    CGFloat startA = 0;//起始角
    CGFloat endA = M_PI_2;//转过的角度
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];

    [path addLineToPoint:center];//这句话让终点在圆心,填充时就能够填充四分之一圆了
    //3.将路径添加到上下文
    CGContextAddPath(ctx, path.CGPath);

    //4.渲染上下文
    //    CGContextStrokePath(ctx);
    CGContextFillPath(ctx);

}
//画弧
-(void)drwaArc
{
    //1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.拼接路径
    CGPoint center = CGPointMake(125, 125);//圆心
    CGFloat radius = 100;//半径
    CGFloat startA = 0;//起始角
    CGFloat endA = M_PI_2;//转过的角度
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];

    //3.将路径添加到上下文
    CGContextAddPath(ctx, path.CGPath);

    //4.渲染上下文
    CGContextStrokePath(ctx);
}

填充圆效果图:
这里写图片描述
画圆时的初始位置是右边缘线中心位置,所以

 CGFloat startA = 0;//起始角

(4)
这里写图片描述
代码名字叫做:我的下载进度条

2.
学习技巧:
iOS的转义字符是%,所以,如果要输出%,应该写“%%”;

3.
UIKit下的画文字和画图片

-(void)drawView:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed:@"屏幕快照 2015-09-07 10.45.54"];

    //    [image drawAtPoint:CGPointZero];(1)
    //    [image drawInRect:CGRectMake(0, 0, 100, 100)];//会自动缩放,如果图片过大会缩小至指定rect;(2)

    //设置裁剪区,超出裁剪区的区域都被裁去
    UIRectClip(CGRectMake(0, 0, 100, 100));//如果需要裁减才需要调用此函数
    [image drawAsPatternInRect:rect];//平铺(3)
}

//画文字
-(void)drawText
{
    // Drawing code
    NSString *text = @"luotuxiu";

    CGRect textFrame = CGRectMake(0, 0, 100, 100);
    NSDictionary *dict  = @{
                            NSFontAttributeName:[UIFont systemFontOfSize:20],
                            NSForegroundColorAttributeName:[UIColor redColor],
                            NSStrokeWidthAttributeName:@10

                            };
    //    UIRectFill(textFrame);//画矩形
    //    [text drawInRect:textFrame withAttributes:dict];//画文字,会自动换行
    [text drawAtPoint:CGPointZero withAttributes:dict];//也是画文字,但不会自动换行
}

4.

学习技巧:
Quartz 2D中一根线一个路径管理。

6.
学习技巧:
关于图形上下文的出栈入栈操作:

- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSaveGState(ctx);//把上下文保存放在栈中,相当于保存一份最初的上下文
       //绘图信息
    UIBezierPath *path = [UIBezierPath bezierPath];

    [path moveToPoint:CGPointMake(10, 125)];

    [path addLineToPoint:CGPointMake(240, 125)];



    CGContextAddPath(ctx, path.CGPath);


    //设置绘图状态
    [[UIColor redColor] set];
    CGContextSetLineWidth(ctx, 10);
    CGContextSetLineCap(ctx, kCGLineCapRound);//设置末尾是圆角

    CGContextStrokePath(ctx);

    UIBezierPath *path1 = [UIBezierPath bezierPath];

    [path1 moveToPoint:CGPointMake(125, 10)];

    [path1 addLineToPoint:CGPointMake(125, 240)];
    CGContextAddPath(ctx, path1.CGPath);

    //把栈顶上下文取出来,这样相当于上下文已经重新初始化了,所以替换成当前上下文
    CGContextRestoreGState(ctx);
//    //设置绘图状态
//    [[UIColor redColor] set];
//    CGContextSetLineWidth(ctx, 1);
//    CGContextSetLineCap(ctx, kCGLineCapRound);//设置末尾是圆角
    CGContextStrokePath(ctx);
}

7.
学习笔记:
上下文的缩放平移可以用矩阵:

- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGContextRef ctx = UIGraphicsGetCurrentContext();


    //矩阵变换要在拼接路径前完成,平移上下文
    CGContextTranslateCTM(ctx, 100, 100);

    //旋转上下文
    CGContextRotateCTM(ctx, M_PI_4);

    //缩放上下文,
    //void CGContextScaleCTM (CGContextRef c,CGFloat sx,CGFloat sy);sx代表着x缩放了多少倍,以此类推
    CGContextScaleCTM(ctx, 0.5, 1.2);

    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-50, -100, 150,200)];


    CGContextAddPath(ctx, path.CGPath);

    CGContextFillPath(ctx);
}

8.
学习技巧:
生成图片水印

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIImage *oldImage = [UIImage imageNamed:@"1"];
    /**     *
     *   开启上下文,位图的上下文
     *  @param size  尺寸,新的图片的大小
     *  @param opaque 不透明 YES
     */
    UIGraphicsBeginImageContextWithOptions(oldImage.size, NO, 0.0);

    [oldImage drawAtPoint:CGPointZero];

    NSString *text = @"哈哈哈哈";
    NSDictionary *dict = @{
                           NSFontAttributeName :[UIFont systemFontOfSize:15],
                           NSForegroundColorAttributeName:[UIColor redColor]
                           };
    [text drawAtPoint:CGPointMake(140, 140) withAttributes:dict];

    //获取新的图片,UIGraphicsGetImageFromCurrentImageContext返回一个Image
    UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();
    _imageView.image = newImage;

    //关闭上下文,以免耗内存
    UIGraphicsEndImageContext();

    //把图片转换成PNG格式的二进制数据
    NSData *data = UIImagePNGRepresentation(newImage);
    //写入桌面
    [data writeToFile:@"/Users/xulei/Desktop/newImage.png" atomically:YES];
}

猜你喜欢

转载自blog.csdn.net/xiaoluodecai/article/details/50773962