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 );
void CGContextAddLineToPoint ( CGContextRef c, CGFloat x, CGFloat y );
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)
出一个距形
弧: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;