1. public func UIGraphicsBeginImageContextWithOptions( size: CGSize, opaque: Bool, _ scale: CGFloat)

    size是要截图的大小,opaque是否不透明,不透明生成的图片小点,scale代表比例,1倍按照size的分辨率进行输出,n倍乘以n,如果需要输出当前设备的分辨率,使用UIScreen.main.scale来获取最合适的比例,也可以直接传0,系统会自动获取合适的scale。沃日。这么简单。。。如果是录视频的话,就得用UIScreen.main.scale

  2. CG框架的内存需要我们手动管理,记得结束的时候释放内存,比如UIGraphicsEndImageContext();

  3. 1
    2
    3
    4
    5
    // 同时设置fill和stroke的颜色
    UIColor.green.set();
    // 下面俩个分别只设置一种
    UIColor.green.setStroke();
    UIColor.green.setFill();
  4. 如果是用UIKit方法获取到的context,那么坐标系原点在左上,否则用CG方法获取到的context坐标系原点在左下.调整左下坐标系到左上坐标系

    1
    2
    3
    4
    5
    6
    7
    CGContextRef 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);
  5. 画虚线方法的各参数含义

    1
    2
    3
    4
    5
    6
    7
    8
    let path = UIBezierPath(rect: CGRect(x: 50, y: 50, width: 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();
  6. 坐标系转换方法例如下面一种

    1
    2
    CGPoint convertedPoint =
    [outerView convertPoint:samplePoint fromView:grayView];

    有一个前提,就是两个View必须在同一个Window中.

  7. Transform

    transform形变的原点都是(0,0)如果想要以中点进行形变,需要改变这个默认原点

    1
    context?.translateBy(x: center.x, y: center.y);
  8. 如果绘图的context不是UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0);那么所绘制的一切用let image = UIGraphicsGetImageFromCurrentImageContext();这个方法截图是只是一张黑色图片,相反如果绘图的context时ImageContext,那么截图可以正常显示出来,但是真实的屏幕上则只显示黑色。

    为了截图不是黑色的图

    1
    2
    3
    4
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, 0.0);
    view.layer.render(in: UIGraphicsGetCurrentContext()!);
    let image2 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
  9. UIRectFill:给自定rect填充一个矩形 UIRectFrame:给自定rect画一个边框

  10. path.usesEvenOddFillRule. usesEvenOddFillRule顾名思义就是even-奇 odd-偶,奇偶规则

  11. 画阴影

1
2
CGContextSetShadowWithColor(context, CGSizeMake(5, 5), 0, [UIColor greenColor].CGColor);
  1. 对文字的动画

    关键点在于用CoreText创建出文字的路径,CoreText提供了对应的方法,代码如下

1
2
大专栏  CoreGraphiclass="line">3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let letters = CGMutablePath();
// 此处font作为attribute传入属性字符串,然后在之后的遍历中取出来使用
let ctfont = CTFontCreateWithName(font.fontName as CFString?, font.pointSize, nil);
let attr = NSAttributedString(string: text, attributes: [kCTFontAttributeName as String : ctfont]);
let line = CTLineCreateWithAttributedString(attr);
let runArray = CTLineGetGlyphRuns(line);
for runIndex in 0..<CFArrayGetCount(runArray) {
let run: CTRun = unsafeBitCast(CFArrayGetValueAtIndex(runArray, runIndex), to: CTRun.self);
let dictRef: CFDictionary = unsafeBitCast(CTRunGetAttributes(run), to: CFDictionary.self);
let dict :NSDictionary = dictRef as NSDictionary;
let runFont = dict[kCTFontAttributeName as String] as! CTFont;
// 取出每一个字形。来创路径
for runGlyphIndex in 0..<CTRunGetGlyphCount(run) {
let thisGlyphRange = CFRangeMake(runGlyphIndex, 1);
var glyph = CGGlyph();
var position = CGPoint.zero;
CTRunGetGlyphs(run, thisGlyphRange, &glyph);
CTRunGetPositions(run, thisGlyphRange, &position);
let letter = CTFontCreatePathForGlyph(runFont, glyph, nil);
let t = CGAffineTransform.init(translationX: position.x, y: position.y);
letters.addPath(letter!, transform: t);
}
}
  1. TransparencyLayer透明图层.待研究

  2. layerx的drawInContext方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 如果在此方法内不将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画图

    1
    2
    3
    4
    5
    6
    7
    let 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.

CoreGraphic的更多相关文章

  1. iOS 离屏渲染的研究

    GPU渲染机制: CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示. G ...

  2. iOS 保持界面流畅的技巧 (转载)

    这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index 演示项目 屏幕显示图像的原理 卡顿产生 ...

  3. iOS中滤镜处理及相关内存泄漏问题的解决

    最近工作之余在做一个美图秀秀的仿品 做到滤镜这块的时候  自己就参考了网上几位博主(名字忘了记,非常抱歉)的博客,但是发现跟着他们的demo做的滤镜处理,都会有很严重的内存泄漏,于是就自己按照大体的思 ...

  4. iOS离屏渲染简书

    更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...

  5. 如何让iOS 保持界面流畅?这些技巧你知道吗

    如何让iOS 保持界面流畅?这些技巧你知道吗   作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...

  6. autolayout autoresizing

    WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门 这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站 ...

  7. 据说是百度ios面试题

    百度面试题:   一面:知识点 Objective C runtime library: Objective C的对象模型,Block的底层实现结构,消息发送,消息转发,内存管理 CoreData : ...

  8. 【原/转】UITableview性能优化总结

    UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...

  9. 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)

    关于AutoLayout,最早从iOS6开始引入使用.   主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换.   网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...

随机推荐

  1. CodeForces 995B Suit and Tie(贪心,暴力)

    https://codeforces.com/problemset/problem/995/B 题意: 就是通过每次移动相邻的两位数,来使数值相同的数挨在一起,求最少要移动多少次. 思路: 直接从前往 ...

  2. Java使用Thrift,Thrift结构体定义

    1.Thrift定义文件,Thrift常见的数据类型 1.基本类型(括号内为对应的Java类型): bool(boolean): 布尔类型(TRUE or FALSE) byte(byte): 8位带 ...

  3. ZZJ_淘淘商城项目:day02(淘淘商城01 - 项目讲解、环境搭建)

    在用Eclipse的开发中,可手动排除不必要的依赖坐标传递. <!-- JPA的1.0依赖 --> <dependency> <groupId>javax.pers ...

  4. python机器学习(2:KNN算法)

    1.KNN 简介:knn算法是监督学习中分类方法的一种.它又被叫k近邻算法,是一个概念极其简单而分类效果又很优秀的分类算法. 核心思想:在训练集中选出离输入的数据最近的k个数据,根据这k个数据的类别判 ...

  5. 【lca+输入】Attack on Alpha-Zet

    Attack on Alpha-Zet 题目描述 Space pirate Captain Krys has recently acquired a map of the artificial and ...

  6. 2020 CCPC Wannafly Winter Camp Day1-F-乘法

    题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...

  7. 二十二、NFS服务深入讲解

    一.查看nfs服务: [root@nfsserve ~]# ps -ef|grep -E "rpc|nfs"rpc       1565     1  0 17:29 ?      ...

  8. Git内部原理(1)

    Git本质上是一套内容寻址文件系统,在此之上提供了VCS的用户界面. Git底层命令(plumbing) vs 高层命令(porcelain) Git的高层命令包括checkout.branch.re ...

  9. 基础篇八:log配置

    第一:首选查看有哪些日志文件 cd /etc/nginx/ cat nginx.conf cd /var/log/nginx/

  10. Qt 编译出现 error LNK2019: 无法解析的外部符号

    编辑完成后执行"构建->执行qmake",完成(必须要执行qmake).