Quartz2D在iOS开发中的价值
2.图形上下文
(输出目标可以是PDF文件、Bitmap或者显示器的窗口上)
自定义view
3)
CGContextRef ctx=UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctx,10,10);
CGContextAddLineToPoint(ctx,100,100);
CGContextStrokePath(ctx);//CGContextFillPath(ctx);
// 图形上下文全部内容重绘
- (void)setNeedsDisplay;
// 图形上下文柜形框内的内容重绘
- (void)setNeedsDisplayInRect:(CGRect);
UIGraphicsGetCurrentContext()
用图形上下文栈,存储当前图形上下方及其复原
CGContextSaveGState(CGContextRef _Nullable c)
CGContextRestoreGState(CGContextRef _Nullable c)
图形上下文的 旋转,缩放,平移
// 图形上下文中的内容旋转了angle角度
CGContextRotateCTM(CGContextRef _Nullable c, CGFloat angle)
// 图形上下文中的内容缩放比例
CGContextScaleCTM(CGContextRef _Nullable c, CGFloat sx, CGFloat sy)
// 图形上下文中的内容x,y的平移
CGContextTranslateCTM(CGContextRef _Nullable c, CGFloat tx, CGFloat ty)
指定一个点成为current point,Quartz会跟踪current point一般执行完一个相关函数后,current point都会相应的改变.
void CGContextMoveToPoint (CGContextRef c, CGFloat x,CGFloat y );
创建一条直线,从current point到 (x,y), 然后current point会变成(x,y)
void CGContextAddLineToPoint (
CGContextRef c,
CGFloat x,
CGFloat y
);
创建多条直线,比如points有两个点,那么会画两条直线 从current point到 (x1,y1), 然后是(x1,y1)到(x2,y2),然后current point会变成points中的最后一个点
void CGContextAddLines (
CGContextRef c,
const CGPoint points[],
size_t count
);
形成封闭图形
CGContextClosePath(CGContextRef _Nullable c)
设置线宽状态:
CGContextSetLineWidth(CGContextRef _Nullable c, CGFloat width);
设置线两端的形状
CGContextSetLineCap(CGContextRef _Nullable c, CGLineCap cap)
设置填充的颜色
CGContextSetRGBFillColor(CGContextRef _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
CGContextSetRGBStrokeColor(CGContextRef _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
裁剪图形
CGContextClip(CGContextRef _Nullable c)
CGContextClipToMask(CGContextRef _Nullable c, CGRect rect, CGImageRef _Nullable mask)
CGContextClipToRect(CGContextRef _Nullable c, CGRect rect)
CGContextClipToRects(CGContextRef _Nullable c, const CGRect * _Nonnull rects, size_t count)
画一个椭圆
- CGContextAddEllipseInRect(CGContextRef _Nullable c, CGRect rect)
出一个距形
弧:Arcs
两种方法创建弧度 第一种
假如想创建一个完整的圆圈,那么 开始弧度就是0 结束弧度是 2pi, 因为圆周长是 2*pi*r.
最后,函数执行完后,current point就被重置为(x,y).
还有一点要注意的是,假如当前path已经存在一个subpath,那么这个函数执行的另外一个效果是
会有一条直线,从current point到弧的起点
第二种
原理:首先画两条线,这两条线分别是 current point to (x1,y1) 和(x1,y1) to (x2,y2).
这样就是出现一个以(x1,y1)为顶点的两条射线,
然后定义半径长度,这个半径是垂直于两条射线的,这样就能决定一个圆了,更好的理解看下图,不过个人认为下图所标的 tangent point 1的位置是错误的。
最后,函数执行完后,current point就被重置为(x2,y2).
还有一点要注意的是,假如当前path已经存在一个subpath,那么这个函数执行的另外一个效果是
会有一条直线,从current point到(x1,y1)
画曲线
<pre name="code" class="objc">// 一个控制点的曲线
CGContextAddQuadCurveToPoint(
CGContextRef _Nullable c,
CGFloat cpx, // 控制点x的位置
CGFloat cpy, // 控制点y的位置
CGFloat x, // 直线的终点x的位置
CGFloat y // 直线的终点y的位置
)
// 两个控制点的曲线
CGContextAddCurveToPoint(CGContextRef _Nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
画文字
NSString 对象方法:
画图片
UIImage 对象方法:
常用绘制路径函数
图片水印
//开启一个基于位图的图形上下文
void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)
//从上下文中取得图片(UIImage)
UIImage* UIGraphicsGetImageFromCurrentImageContext();
//结束基于位图的图形上下文
void UIGraphicsEndImageContext();
屏幕截图
//调用某个view的layer的renderInContext:方法即可
- (void)renderInContext:(CGContextRef)ctx;