CoreGraphic
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();
- 1
- 2
- 3
- 4
- 5
- // 同时设置fill和stroke的颜色
- UIColor.green.set();
- // 下面俩个分别只设置一种
- UIColor.green.setStroke();
- UIColor.green.setFill();
如果是用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);
画虚线方法的各参数含义
- 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();
坐标系转换方法例如下面一种
- 1
- 2
- CGPoint convertedPoint =
- [outerView convertPoint:samplePoint fromView:grayView];
有一个前提,就是两个View必须在同一个Window中.
Transform
transform形变的原点都是(0,0)如果想要以中点进行形变,需要改变这个默认原点
- 1
- context?.translateBy(x: center.x, y: center.y);
如果绘图的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();
UIRectFill:给自定rect填充一个矩形 UIRectFrame:给自定rect画一个边框
path.usesEvenOddFillRule. usesEvenOddFillRule顾名思义就是even-奇 odd-偶,奇偶规则
画阴影
|
|
对文字的动画
关键点在于用CoreText创建出文字的路径,CoreText提供了对应的方法,代码如下
|
|
TransparencyLayer透明图层.待研究
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的更多相关文章
- iOS 离屏渲染的研究
GPU渲染机制: CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示. G ...
- iOS 保持界面流畅的技巧 (转载)
这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index 演示项目 屏幕显示图像的原理 卡顿产生 ...
- iOS中滤镜处理及相关内存泄漏问题的解决
最近工作之余在做一个美图秀秀的仿品 做到滤镜这块的时候 自己就参考了网上几位博主(名字忘了记,非常抱歉)的博客,但是发现跟着他们的demo做的滤镜处理,都会有很严重的内存泄漏,于是就自己按照大体的思 ...
- iOS离屏渲染简书
更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...
- 如何让iOS 保持界面流畅?这些技巧你知道吗
如何让iOS 保持界面流畅?这些技巧你知道吗 作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...
- autolayout autoresizing
WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门 这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站 ...
- 据说是百度ios面试题
百度面试题: 一面:知识点 Objective C runtime library: Objective C的对象模型,Block的底层实现结构,消息发送,消息转发,内存管理 CoreData : ...
- 【原/转】UITableview性能优化总结
UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...
- 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)
关于AutoLayout,最早从iOS6开始引入使用. 主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换. 网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...
随机推荐
- SAP AM:固定资产采购的预算管理
对于很多公司来说,购买资产是公司年度支持的主要部分,因此需要用预算管理来防止过度支出.这项支出被列为资本支出,所以很多公司都需要对购买过程和安全防范进行良好的控制.以下文中说明如何在购买资产时使用预算 ...
- Vue其他指令-组件-全局-局部-组件的交互父传子
v-once指令 once:一旦,当...时候 <!DOCTYPE html> <html lang="zh"> <head> <meta ...
- 黑科技如何制造人类V2.0?
黑科技泛指人类尚未成熟但具有巨大潜力的科学技术,智能手机.大数据.扫码支付.电子地图等等都曾属于黑科技范畴,随着时间的推移,它们慢慢成熟,且展现出巨大的能力,影响人类进程,最终黑科技转变成人类伟大的创 ...
- NOIP 2004 T3 合唱队形(DP、最长上升/下降子序列)
链接:https://ac.nowcoder.com/acm/contest/1082/C来源:牛客网 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队 ...
- NOIP2000提高组T1 进制转换
https://www.luogu.org/problem/P1017 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的值减1为指数,以10为底数的幂之和 ...
- 【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
http://blog.csdn.net/sugar_girl/article/details/53400267 <HeadFirst JAVA设计模式>中用迭代器迭代组合模式是存 ...
- java 的ConcurrentHashMap底层数据结构
集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...
- Linux_实验1 Red Hat的使用
目录 使用rjxy用户登录图形界面 由当前控制台切换到tty4虚拟控制台: 由当前用户切换到root用户: 用root用户查看当前运行级别,并把当前运行级别切换到3级,再切换到5级运行级别: 用“ge ...
- 吴裕雄--天生自然python学习笔记:python实现自动网页测试
Python 可实现的网页测试的功能十分强大,甚至能通 过编程来实现让绝大多数的测试过程自动化. 这对很多开 发者来说,绝对是不可多得的神器. hash lib 纽件可以判别文件是否有过更改,只需要用 ...
- SQL数据库的查询方法
简单查询: 一.投影 select * from 表名 select 列1,列2... from 表名 select distinct 列名 from 表名 二.筛选 select top 数字 列| ...