IOS开发之——绘图(CGContext)
<div><div>
<pre class="hljs objectivec"><code class="objectivec"><span class="hljs-number">0 <span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext(); 设置上下文
<span class="hljs-number">1 <span class="hljs-built_in">CGContextMoveToPoint 开始画线
<span class="hljs-number">2 <span class="hljs-built_in">CGContextAddLineToPoint 画直线
<span class="hljs-number">4 <span class="hljs-built_in">CGContextAddEllipseInRect 画一椭圆
<span class="hljs-number">4 <span class="hljs-built_in">CGContextSetLineCap 设置线条终点形状
<span class="hljs-number">4 <span class="hljs-built_in">CGContextSetLineDash 画虚线
<span class="hljs-number">4 <span class="hljs-built_in">CGContextAddRect 画一方框
<span class="hljs-number">4 <span class="hljs-built_in">CGContextStrokeRect 指定矩形
<span class="hljs-number">4 <span class="hljs-built_in">CGContextStrokeRectWithWidth 指定矩形线宽度
<span class="hljs-number">4 <span class="hljs-built_in">CGContextStrokeLineSegments 一些直线
<span class="hljs-number">5 <span class="hljs-built_in">CGContextAddArc 画一曲线 前<span class="hljs-number">2点为中心 中间俩店为起始弧度 最后一数据为<span class="hljs-number">0则顺时针画<span class="hljs-number">1则逆时针
<span class="hljs-number">5 <span class="hljs-built_in">CGContextAddArcToPoint(context,<span class="hljs-number">0,<span class="hljs-number">0, <span class="hljs-number">2, <span class="hljs-number">9, <span class="hljs-number">40);先画俩条线从point 到第<span class="hljs-number">1点 从第<span class="hljs-number">1点到第<span class="hljs-number">2点的线切割里面的圆
<span class="hljs-number">6 <span class="hljs-built_in">CGContextSetShadowWithColor 设置阴影
颜色
<span class="hljs-number">7 <span class="hljs-built_in">CGContextSetRGBFillColor 设置填充颜色
<span class="hljs-number">7 <span class="hljs-built_in">CGContextSetRGBStrokeColor 设置画笔/边框颜色
<span class="hljs-number">7 <span class="hljs-built_in">CGContextSetFillColorSpace 颜色空间填充
<span class="hljs-number">7 <span class="hljs-built_in">CGConextSetStrokeColorSpace 颜色空间画笔设置
<span class="hljs-number">8 <span class="hljs-built_in">CGContextFillRect 补充当前填充颜色的rect
<span class="hljs-number">8 <span class="hljs-built_in">CGContextSetAlaha 透明度
<span class="hljs-number">9 <span class="hljs-built_in">CGContextTranslateCTM 改变画布位置
<span class="hljs-number">10 <span class="hljs-built_in">CGContextSetLineWidth 设置线的宽度
<span class="hljs-number">11 <span class="hljs-built_in">CGContextAddRects 画多个线
<span class="hljs-number">12 <span class="hljs-built_in">CGContextAddQuadCurveToPoint 画曲线
<span class="hljs-number">13<span class="hljs-built_in">CGContextStrokePath 开始绘制图片
<span class="hljs-number">13 <span class="hljs-built_in">CGContextDrawPath 设置绘制模式
<span class="hljs-number">14 <span class="hljs-built_in">CGContextClosePath 封闭当前线路
<span class="hljs-number">15 <span class="hljs-built_in">CGContextTranslateCTM(context, <span class="hljs-number">0, rect.size.height);
<span class="hljs-built_in">CGContextScaleCTM(context, <span class="hljs-number">1.0, <span class="hljs-number">-1.0);反转画布
<span class="hljs-number">16 <span class="hljs-built_in">CGContextSetInterpolationQuality 背景内置颜色质量等级
<span class="hljs-number">16 <span class="hljs-built_in">CGImageCreateWithImageInRect 从原图片中取小图
<span class="hljs-number">17 字符串的写入可用<span class="hljs-built_in">NSString本身的画图方法
- (<span class="hljs-built_in">CGSize)drawInRect:(<span class="hljs-built_in">CGRect)rect withFont:(<span class="hljs-built_in">UIFont *)font lineBreakMode:
(<span class="hljs-built_in">UILineBreakMode)lineBreakMode alignment:(<span class="hljs-built_in">UITextAlignment)alignment;
<span class="hljs-number">18对图片放大缩小的功能就是慢了点
<span class="hljs-built_in">UIGraphicsBeginImageContext(newSize);
<span class="hljs-built_in">UIImage* newImage = <span class="hljs-built_in">UIGraphicsGetImageFromCurrentImageContext();
<span class="hljs-built_in">UIGraphicsEndImageContext();
<span class="hljs-number">19 <span class="hljs-built_in">CGColorGetComponents() 返回颜色的各个直 以及透明度 可用只读<span class="hljs-keyword">const <span class="hljs-keyword">float 来接收是个数组
<span class="hljs-number">20 画图片
<span class="hljs-built_in">CGImageRef image=<span class="hljs-built_in">CGImageRetain(img.CGImage);
<span class="hljs-built_in">CGContextDrawImage(context, <span class="hljs-built_in">CGRectMake(<span class="hljs-number">10.0, height - <span class="hljs-number">100.0, <span class="hljs-number">90.0, <span class="hljs-number">90.0), image);
<span class="hljs-number">21 实现逐变颜色填充方法
<span class="hljs-built_in">CGContextClip(context);
<span class="hljs-built_in">CGColorSpaceRef rgb = <span class="hljs-built_in">CGColorSpaceCreateDeviceRGB();
<span class="hljs-built_in">CGFloat colors[] =
{
<span class="hljs-number">204.0 / <span class="hljs-number">255.0, <span class="hljs-number">224.0 / <span class="hljs-number">255.0, <span class="hljs-number">244.0 / <span class="hljs-number">255.0, <span class="hljs-number">1.00,
<span class="hljs-number">29.0 / <span class="hljs-number">255.0, <span class="hljs-number">156.0 / <span class="hljs-number">255.0, <span class="hljs-number">215.0 / <span class="hljs-number">255.0, <span class="hljs-number">1.00,
<span class="hljs-number">0.0 / <span class="hljs-number">255.0,<span class="hljs-number">50.0 / <span class="hljs-number">255.0, <span class="hljs-number">126.0 / <span class="hljs-number">255.0, <span class="hljs-number">1.00,
};
<span class="hljs-built_in">CGGradientRef gradient = <span class="hljs-built_in">CGGradientCreateWithColorComponents(rgb, colors, <span class="hljs-literal">NULL, <span class="hljs-keyword">sizeof(colors)/(<span class="hljs-keyword">sizeof(colors[<span class="hljs-number">0])*<span class="hljs-number">4));
<span class="hljs-built_in">CGColorSpaceRelease(rgb);
<span class="hljs-built_in">CGContextDrawLinearGradient(context, gradient,<span class="hljs-built_in">CGPointMake(<span class="hljs-number">0.0,<span class="hljs-number">0.0) ,<span class="hljs-built_in">CGPointMake(<span class="hljs-number">0.0,<span class="hljs-keyword">self.frame.size.height),kCGGradientDrawsBeforeStartLocation);
<span class="hljs-number">22 注:画完图后,必须先用<span class="hljs-built_in">CGContextStrokePath来描线,即形状后用<span class="hljs-built_in">CGContextFillPath来填充形状内的颜色.
填充一个路径的时候,路径里面的子路径都是独立填充的。
假如是重叠的路径,决定一个点是否被填充,有两种规则
<span class="hljs-number">1,nonzero winding number rule:非零绕数规则,假如一个点被从左到右跨过,计数器+<span class="hljs-number">1,从右到左跨过,计数器<span class="hljs-number">-1,最后,如果结果是<span class="hljs-number">0,那么不填充,如果是非零,那么填充。
<span class="hljs-number">2,even-odd rule: 奇偶规则,假如一个点被跨过,那么+<span class="hljs-number">1,最后是奇数,那么要被填充,偶数则不填充,和方向没有关系。
<span class="hljs-built_in">CGContextEOFillPath 使用奇偶规则填充当前路径
<span class="hljs-built_in">CGContextFillPath 使用非零绕数规则填充当前路径
<span class="hljs-built_in">CGContextFillRect 填充指定的矩形
<span class="hljs-built_in">CGContextFillRects填充指定的一些矩形
<span class="hljs-built_in">CGContextFillEllipseInRect填充指定矩形中的椭圆
<span class="hljs-built_in">CGContextDrawPath
两个参数决定填充规则,
kCGPathFill表示用非零绕数规则,
kCGPathEOFill表示用奇偶规则,
kCGPathFillStroke表示填充,
kCGPathEOFillStroke表示描线,不是填充
当一个颜色覆盖上另外一个颜色,两个颜色怎么混合
默认方式是
result = (alpha * foreground) + (<span class="hljs-number">1 - alpha) * background
<span class="hljs-built_in">CGContextSetBlendMode :设置blend mode.
<span class="hljs-built_in">CGContextSaveGState :保存blend mode.
<span class="hljs-built_in">CGContextRestoreGState:在没有保存之前,用这个函数还原blend mode.
<span class="hljs-built_in">CGContextSetBlendMode 混合俩种颜色
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>以上引用</p>
<p>======================================================================</p>
<br>
<div class="image-package">
<div class="image-container" style="max-width: 600px; max-height: 238px">
<div class="image-view" data-width="600" data-height="238"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729145801625-925491018.jpg"></div>
</div>
<div class="image-caption">IOS直线样式</div>
</div>
<p>======================================================================</p>
<h4>虚线</h4>
<p>画虚线需要用到函数:</p>
<pre class="hljs objectivec"><code class="objectivec"><span class="hljs-built_in">CG_EXTERN <span class="hljs-keyword">void <span class="hljs-built_in">CGContextSetLineDash(<span class="hljs-built_in">CGContextRef __<span class="hljs-keyword">nullable c, <span class="hljs-built_in">CGFloat phase,
<span class="hljs-keyword">const <span class="hljs-built_in">CGFloat * __<span class="hljs-keyword">nullable lengths, size_t count)
<span class="hljs-built_in">CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>此函数需要四个参数:<br>
<strong>context</strong> – 这个不用多说<br>
<strong>phase</strong> - 稍后再说<br>
<strong>lengths</strong> – 指明虚线是如何交替绘制,具体看例子<br>
<strong>count</strong> – lengths数组的长度</p>
<pre class="hljs objectivec"><code class="objectivec"><span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextBeginPath(context);
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">2.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColorwhiteColor].CGColor);
<span class="hljs-keyword">float lengths[] = {<span class="hljs-number">10,<span class="hljs-number">10};
<span class="hljs-built_in">CGContextSetLineDash(context, <span class="hljs-number">0, lengths,<span class="hljs-number">2);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">10.0, <span class="hljs-number">20.0);
<span class="hljs-built_in">CGContextAddLineToPoint(context, <span class="hljs-number">310.0,<span class="hljs-number">20.0);
<span class="hljs-built_in">CGContextStrokePath(context);
<span class="hljs-built_in">CGContextClosePath(context);
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<ul>
<li>
<p>lengths的值{10,10}表示先绘制10个点,再跳过10个点,如此反复,如图:</p>
<br>
<div class="image-package">
<div class="image-container" style="max-width: 300px; max-height: 16px">
<div class="image-view" data-width="300" data-height="16"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729145850345-1709498886.gif"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
</li>
<li>
<p>如果把lengths值改为{10, 20, 10},则表示先绘制10个点,跳过20个点,绘制10个点,跳过10个点,再绘制20个点,如此反复,如图:</p>
<br>
<div class="image-package">
<div class="image-container" style="max-width: 313px; max-height: 15px">
<div class="image-view" data-width="313" data-height="15"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729145916993-1200560947.gif"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
</li>
<li>
<p><strong>注意count的值等于lengths数组的长度</strong></p>
</li>
<li>
<p><strong>phase参数表示在第一个虚线绘制的时候跳过多少个点,举例说明:</strong></p>
</li>
</ul>
<pre class="hljs objectivec"><code class="objectivec"><span class="hljs-keyword">float lengths[] = {<span class="hljs-number">10,<span class="hljs-number">5};
<span class="hljs-built_in">CGContextSetLineDash(context, <span class="hljs-number">0, lengths, <span class="hljs-number">2);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">0.0, <span class="hljs-number">20.0);
<span class="hljs-built_in">CGContextAddLineToPoint(context, <span class="hljs-number">310.0, <span class="hljs-number">20.0);
<span class="hljs-built_in">CGContextStrokePath(context);
========
<span class="hljs-built_in">CGContextSetLineDash(context, <span class="hljs-number">5, lengths, <span class="hljs-number">2);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">0.0, <span class="hljs-number">40.0);
<span class="hljs-built_in">CGContextAddLineToPoint(context, <span class="hljs-number">310.0, <span class="hljs-number">40.0);
<span class="hljs-built_in">CGContextStrokePath(context);
========
<span class="hljs-built_in">CGContextSetLineDash(context, <span class="hljs-number">8, lengths, <span class="hljs-number">2);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">0.0, <span class="hljs-number">60.0);
<span class="hljs-built_in">CGContextAddLineToPoint(context, <span class="hljs-number">310.0, <span class="hljs-number">60.);
<span class="hljs-built_in">CGContextStrokePath(context);
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
如图显示:
<div class="image-package">
<div class="image-container" style="max-width: 284px; max-height: 81px">
<div class="image-view" data-width="284" data-height="81"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729145935653-1159477716.gif"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<br>
<p>由于lengths值为{10,5},第一条线就是绘制10,跳过5,反复绘制。<br>
第二条线的phase值为5,则首先绘制【10减去5】,再跳过5,绘制10,反复绘制。<br>
第三条给也如此,先绘制2,再跳过5,如此反复。</p>
<p>================================================================<br>
切线</p>
<pre class="hljs objectivec"><code class="objectivec">- (<span class="hljs-keyword">void)drawRect:(<span class="hljs-built_in">CGRect)rect {
<span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">2.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColor blueColor].CGColor);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">100, <span class="hljs-number">100);<span class="hljs-comment">//起始点
<span class="hljs-built_in">CGContextAddArcToPoint(context, <span class="hljs-number">100,<span class="hljs-number">200, <span class="hljs-number">300,<span class="hljs-number">200, <span class="hljs-number">100);<span class="hljs-comment">//点1,点2,半径
<span class="hljs-built_in">CGContextStrokePath(context);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container" style="max-width: 321px; max-height: 479px">
<div class="image-view" data-width="321" data-height="479"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729145954297-354698971.jpg"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<p>================================================================<br>
椭圆</p>
<pre class="hljs objectivec"><code class="objectivec">- (<span class="hljs-keyword">void)drawRect:(<span class="hljs-built_in">CGRect)rect {
<span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">2.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColor blueColor].CGColor);
<span class="hljs-built_in">CGRect rectangle = <span class="hljs-built_in">CGRectMake(<span class="hljs-number">60,<span class="hljs-number">170,<span class="hljs-number">200,<span class="hljs-number">80);
<span class="hljs-built_in">CGContextAddEllipseInRect(context, rectangle);
<span class="hljs-built_in">CGContextStrokePath(context);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container" style="max-width: 321px; max-height: 480px">
<div class="image-view" data-width="321" data-height="480"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729150021205-351461352.jpg"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<p>================================================================<br>
曲线</p>
<pre class="hljs objectivec"><code class="objectivec">- (<span class="hljs-keyword">void)drawRect:(<span class="hljs-built_in">CGRect)rect {
<span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">2.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColor blueColor].CGColor);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">10, <span class="hljs-number">10);<span class="hljs-comment">//起始点
<span class="hljs-built_in">CGContextAddCurveToPoint(context, <span class="hljs-number">0, <span class="hljs-number">50, <span class="hljs-number">300, <span class="hljs-number">250, <span class="hljs-number">300, <span class="hljs-number">400);<span class="hljs-comment">//控制点1,控制点2,终点
<span class="hljs-built_in">CGContextStrokePath(context);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container" style="max-width: 321px; max-height: 480px">
<div class="image-view" data-width="321" data-height="480"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729150044231-383673530.jpg"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<p>================================================================<br>
曲线</p>
<pre class="hljs objectivec"><code class="objectivec">- (<span class="hljs-keyword">void)drawRect:(<span class="hljs-built_in">CGRect)rect {
<span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">2.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColor blueColor].CGColor);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">10, <span class="hljs-number">200);
<span class="hljs-built_in">CGContextAddQuadCurveToPoint(context, <span class="hljs-number">150, <span class="hljs-number">10, <span class="hljs-number">300, <span class="hljs-number">200);<span class="hljs-comment">//控制点1,终点
<span class="hljs-built_in">CGContextStrokePath(context);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container" style="max-width: 322px; max-height: 482px">
<div class="image-view" data-width="322" data-height="482"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729150111553-1187145894.jpg"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<p>================================================================<br>
虚线曲线</p>
<pre class="hljs objectivec"><code class="objectivec">- (<span class="hljs-keyword">void)drawRect:(<span class="hljs-built_in">CGRect)rect {
<span class="hljs-built_in">CGContextRef context = <span class="hljs-built_in">UIGraphicsGetCurrentContext();
<span class="hljs-built_in">CGContextSetLineWidth(context, <span class="hljs-number">5.0);
<span class="hljs-built_in">CGContextSetStrokeColorWithColor(context, [<span class="hljs-built_in">UIColor blueColor].CGColor);
<span class="hljs-built_in">CGFloat dashArray[] = {<span class="hljs-number">2,<span class="hljs-number">6,<span class="hljs-number">4,<span class="hljs-number">2};
<span class="hljs-built_in">CGContextSetLineDash(context, <span class="hljs-number">3, dashArray, <span class="hljs-number">4);
<span class="hljs-built_in">CGContextMoveToPoint(context, <span class="hljs-number">10, <span class="hljs-number">200);
<span class="hljs-built_in">CGContextAddQuadCurveToPoint(context, <span class="hljs-number">150, <span class="hljs-number">10, <span class="hljs-number">300, <span class="hljs-number">200);<span class="hljs-comment">//控制点1,终点
<span class="hljs-built_in">CGContextStrokePath(context);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container" style="max-width: 321px; max-height: 481px">
<div class="image-view" data-width="321" data-height="481"><img src="https://img2018.cnblogs.com/blog/556239/201907/556239-20190729150132940-1397383075.jpg"></div>
</div>
<div class="image-caption">IOS开发笔记之绘图(CGContext小记)</div>
</div>
<p>================================================================<br>
以上引用<br>
更多详情<br>
更多详情</p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/Free-Thinker/p/11263923.html
頁:
[1]