public func UIGraphicsBeginImageContextWithOptions( size: CGSize, opaque: Bool, _ scale: CGFloat)
size是要截图的大小,opaque是否不透明,不透明生成的图片小点,scale代表比例,1倍按照size的分辨率进行输出,n倍乘以n,如果需要输出当前设备的分辨率,使用UIScreen.main.scale来获取最合适的比例,也可以直接传0,系统会自动获取合适的scale。沃日。这么简单。。。如果是录视频的话,就得用UIScreen.main.scale
CG框架的内存需要我们手动管理,记得结束的时候释放内存,比如UIGraphicsEndImageContext();
- 12345// 同时设置fill和stroke的颜色UIColor.green.set();// 下面俩个分别只设置一种UIColor.green.setStroke();UIColor.green.setFill();
如果是用UIKit方法获取到的context,那么坐标系原点在左上,否则用CG方法获取到的context坐标系原点在左下.调整左下坐标系到左上坐标系
1234567CGContextRef context = UIGraphicsGetCurrentContext(); if (context == NULL){NSLog(@"Error: No context to flip");return; }CGAffineTransform transform = CGAffineTransformIdentity;transform = CGAffineTransformScale(transform, 1.0f, -1.0f);transform = CGAffineTransformTranslate(transform, 0.0f, -size.height); CGContextConcatCTM(context, transform);画虚线方法的各参数含义
12345678let path = UIBezierPath(rect: CGRect(x: 50, y: 50, 100, height: 100));UIColor.green.set();// 数组的值代表第一个线宽为6然后第二个线宽为2,第三个线宽为5.以此类推.// 空白也算一个线段,也参与计算宽度.所以如下所示就是第一个实线宽度为6,然后接下来的空白宽度为2,然后接下来的实线宽度为5然后接下来的空白宽度为6...以此类推let dashes:[CGFloat] = [6.0, 2.0, 5.0];// count要等于dashes数组的长度,phase表示跳过多少个点.如上数组所示,6就是6个点path.setLineDash(dashes, count: 3, phase: 0);path.stroke();坐标系转换方法例如下面一种
12CGPoint convertedPoint =[outerView convertPoint:samplePoint fromView:grayView];有一个前提,就是两个View必须在同一个Window中.
Transform
transform形变的原点都是(0,0)如果想要以中点进行形变,需要改变这个默认原点
1context?.translateBy(x: center.x, y: center.y);如果绘图的context不是UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0);那么所绘制的一切用let image = UIGraphicsGetImageFromCurrentImageContext();这个方法截图是只是一张黑色图片,相反如果绘图的context时ImageContext,那么截图可以正常显示出来,但是真实的屏幕上则只显示黑色。
为了截图不是黑色的图
1234UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, 0.0);view.layer.render(in: UIGraphicsGetCurrentContext()!);let image2 = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();UIRectFill:给自定rect填充一个矩形 UIRectFrame:给自定rect画一个边框
path.usesEvenOddFillRule. usesEvenOddFillRule顾名思义就是even-奇 odd-偶,奇偶规则
画阴影
|
|
对文字的动画
关键点在于用CoreText创建出文字的路径,CoreText提供了对应的方法,代码如下
|
|
TransparencyLayer透明图层.待研究
layerx的drawInContext方法
12345678910// 如果在此方法内不将ctx压入栈中会导致接下去的bezeirPath画图方法失效。原因是rectPath.stroke()// 是在当前ctx生效的,可是如果不压入栈中,当前的ctx就会为空UIGraphicsPushContext(ctx);let rectPath = UIBezierPath(rect: self.outsideRect);UIColor.black.setStroke();let dash = [5.0.cgfloatValue, 5.0.cgfloatValue];rectPath.lineWidth = 1.0;rectPath.setLineDash(dash, count: 2, phase: 0);rectPath.stroke();UIGraphicsPushContext(ctx);如果不选择
UIGraphicsPushContext(ctx);
这种方法,那么需要用到C的API画图1234567let rectPath = UIBezierPath(rect: self.outsideRect);ctx.addPath(rectPath.cgPath);ctx.setStrokeColor(UIColor.black.cgColor);ctx.setLineWidth(1.0);let dash = [5.0.cgfloatValue, 5.0.cgfloatValue];ctx.setLineDash(phase: 0, lengths: dash);ctx.strokePath();这样就不会依赖UIGraphicsGetCurrentContext.