Quartz2D

// --- 关键方法

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

// 创建可变路径(c)
CGMutablePathRef path = CGPathCreateMutable();

// 把路径放在上下文当中
CGContextAddPath(ctx, path);

// 创建路径对象(oc)
UIBezierPath* path = [UIBezierPath bezierPath];

// 渲染
CGContextStrokePath(ctx);

// --- 绘图的步骤

// 1.获取图形上下文

// 2.拼接路径 同时 添加到上下文当中

// 3.渲染

// --- 绘图的方式

// 5种
// 1.c 直接在上下文当中去拼接路径
// 2.c 先拼接路径 再把路径添加到上下文当中
// 3.c + oc 基本等同于第二种 把oc的path 转化成 CGPath
// 4.c + oc 把CGPath 转化成 oc的path
// 5.oc 声明path对象 拼接路径 渲染

// --- 关于drawrect

// 1.为什么代码要写在drawrect里面
// 因为只正确的上下文

// 2.drawrect方法中rect参数的含义是什么
// rect是当前view的bounds

// 3.drawrect什么时候调用
// 系统自动调用
// (1)当这个view第一次显示的时候调用
// (2)当重绘的时候调用

// 4.如何重绘
// view的setNeedsDisplay方法
// view的setNeedsDisplayInRect方法  rect参数是刷新指定的区域

// 5.为什么drawRect不要手动调用
// 因为系统调的时候是会确保创建view的上下文
// 手动调用的时候可能获取不到

// --- 绘图的样式
// 设置线宽
CGContextSetLineWidth(ctx, 20);
// 设置连接处的样式
CGContextSetLineJoin(ctx, kCGLineJoinRound);
// 设置头尾的样式
CGContextSetLineCap(ctx, kCGLineCapRound);

// 设置线的宽度
[path setLineWidth:30];

//       kCGLineJoinMiter, // 默认的效果
//       kCGLineJoinRound, // 圆角
//       kCGLineJoinBevel // 切角
// 设置连接处的样式
[path setLineJoinStyle:kCGLineJoinBevel];

//       kCGLineCapButt, // 默认
//       kCGLineCapRound, // 圆角
//       kCGLineCapSquare
// 设置头尾的样式
[path setLineCapStyle:kCGLineCapButt];

// --- 绘图的渲染的方式

// oc
[path stroke];
[path fill];

// c
// CGContextDrawPath(ctx, kCGPathStroke); <==> CGContextStrokePath(ctx);
// CGContextDrawPath(ctx, kCGPathFill); <==> CGContextFillPath(ctx);

// 既描边又填充
// c:
CGContextDrawPath(ctx, kCGPathFillStroke);
// oc: 两句话都执行
[path stroke];
[path fill];

// --- 奇偶填充规则

// c
CGContextDrawPath(ctx, kCGPathEOFill);

// oc
path.usesEvenOddFillRule = YES;

// 奇填偶不填

// --- 非零绕数

// 默认填充模式: nonzero winding number rule(非零绕数规则)从左到右跨过, +1。从右到左跨过, -1。最后如果为0, 那么不填充, 否则填充

// 验证 取区域中 任意一个点 拉一条射线 看图形与射线的交叉点 是从左往右还是从右往左

// --- 饼图

// 随机颜色
- (UIColor*)randomColor
{
    CGFloat r = arc4random() % 256 / 255.0;
    CGFloat g = arc4random() % 256 / 255.0;
    CGFloat b = arc4random() % 256 / 255.0;

    return [UIColor colorWithRed:r green:g blue:b alpha:1];
}

// 比较最小的值
MIN(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5)

// 画扇形的时候 记得往圆心 连一条线

// --- 旋转缩放平移

// 对图形上下文进行旋转平移缩放的操作

// 缩放
// 第一个参数:需要缩放的上下文
// 第二个参数:x轴缩放的比例
// 第三个参数:y轴缩放的比例
CGContextScaleCTM(ctx, 1, 0.5);

// 平移
// 第一个参数:需要平移的上下文
// 第二个参数:x轴的偏移量
// 第三个参数:y轴的偏移量
CGContextTranslateCTM(ctx, 150, 150);

// 旋转
// 第一个参数:需要旋转的上下文
// 第二个参数:顺时针旋转的角度
CGContextRotateCTM(ctx, M_PI_4);

// --- 图形上下文栈

// 图形上下文栈 只是保存 状态信息(样式)

// 保存状态信息
CGContextSaveGState(ctx);

// 恢复状态信息
CGContextRestoreGState(ctx);

// --- quartz2d 内存管理
// 如果包含 create copy 关键字的时候 记得释放
// 释放 1
CGPathRelease(path);
// 释放 2
CFRelease(path);

// option + command + [ ] // 移动代码



//****************************
// --- 旋转缩放平移(矩阵操作)

// 对图形上下文进行旋转平移缩放的操作

// 缩放
// 第一个参数:需要缩放的上下文
// 第二个参数:x轴缩放的比例
// 第三个参数:y轴缩放的比例
CGContextScaleCTM(ctx, 1, 0.5);

// 平移
// 第一个参数:需要平移的上下文
// 第二个参数:x轴的偏移量
// 第三个参数:y轴的偏移量
CGContextTranslateCTM(ctx, 150, 150);

// 旋转
// 第一个参数:需要旋转的上下文
// 第二个参数:顺时针旋转的角度
CGContextRotateCTM(ctx, M_PI_4);

// --- 图形上下文栈

// 图形上下文栈 只是保存 状态信息(样式)

// 保存状态信息
CGContextSaveGState(ctx);

// 恢复状态信息
CGContextRestoreGState(ctx);

// --- quartz2d 内存管理
// 如果包含 create copy 关键字的时候 记得释放
// 释放 1
CGPathRelease(path);
// 释放 2
CFRelease(path);



// --- 绘制文字
// 绘制 - 从(0,0)点开始画
[str drawAtPoint:CGPointZero withAttributes:dict];

// 绘制 - 绘制到指定的区域
[str drawInRect:rect withAttributes:nil];

// AttributeName - key 在 UIKit下的 NSAttributeName.h 里面
// 个人建议 记其中一个

// shadow
NSShadow* s = [[NSShadow alloc] init];
s.shadowOffset = CGSizeMake(100, 100); // 偏移量
s.shadowBlurRadius = 0; // 越小越不模糊
s.shadowColor = [UIColor yellowColor]; // 阴影的颜色

// --- 绘制图片
// 绘制 - 从某个点开始绘制
[image drawAtPoint:CGPointZero];
// 绘制 - 绘制到某一个区域
[image drawInRect:rect];
// 绘制 - 平铺
[image drawAsPatternInRect:rect]; // 可以考虑用来设置某个view的背景图片

// --- 裁剪上下文显示的区域
// 前提:画一个图形
// 裁剪图片
CGContextClip(ctx);

// 告诉系统 已这个图形来裁剪图片 渲染 然后显示出来
// 所谓裁剪并不是裁剪掉上下文 只是单纯的 裁剪出来希望显示的区域而已!!!

// --- bitmap上下文

// 创建上下文(图片)
UIGraphicsBeginImageContext(CGSizeMake(300, 300));
// 创建上下文 (大小,不透明,缩放:0)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0);

// 关闭上下文
UIGraphicsEndImageContext();

//  通过图片的图形上下文获取图片
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();


// 保存到沙盒当中
NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
path = [path stringByAppendingPathComponent:@"xx.png"];
// tmp 路径
 NSTemporaryDirectory()

// 把image转化成 NSData类型
NSData* data = UIImagePNGRepresentation(image);
NSLog(@"%ld", data.length);
// 然后在通过data对象  write to file 来写入到沙盒中
[data writeToFile:path atomically:YES];

// --- 裁剪圆形图片
// 保存到相册
// 第一个:图片
// 第二个 第三个 监听   注意:@selector 不能随便写 使用"注释"当中的方法
// 第四个: 可以把它当做一个tag来使用 参数在监听的方法当中会传入
UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(image:didFinishSavingWithError:contextInfo:), @"hello1111");

// --- 屏幕截图
// 对控制器的view的layer属性 进行操作
[self.view.layer renderInContext:ctx];

// control + command + p  // Peckham




//*****************************


你可能感兴趣的:(Quartz2D)