(四十八)Quartz2D引擎进阶
来源:互联网 发布:yes风淘宝客程序下载 编辑:程序博客网 时间:2024/05/16 01:49
图形上下文栈:
应用,修改过上下文后,下一次画会在这个基础上进行,如果清空状态,需要上下文栈。
可以先把原来的上下文保存起来,然后恢复:
- (void)drawRect:(CGRect)rect { CGContextRef ref = UIGraphicsGetCurrentContext(); // 保存上下文 CGContextSaveGState(ref); CGContextMoveToPoint(ref, 100, 100); CGContextAddLineToPoint(ref, 200, 200); [[UIColor redColor] set]; CGContextSetLineCap(ref, kCGLineCapRound); CGContextSetLineWidth(ref, 5); CGContextStrokePath(ref); // 恢复上下文 CGContextRestoreGState(ref); CGContextMoveToPoint(ref, 250, 200); CGContextAddLineToPoint(ref, 100, 180); CGContextStrokePath(ref); }
在CGContextRef中有一个专门的空间用于保存上下文的状态,在其内部也有一个区域会把要画的东西先画一遍。
CGContextSaveGState是将ctx拷贝一份,放到栈中,Restore则是出栈。
Tip:CorePlot已经封装好了各种函数图。
矩阵操作:
先设置状态,再画才有作用:注意角度转弧度的时候除以180.0。
第一个是改变缩放比例,第二个是跳转转角。
CGContextScaleCTM(ctx, x_scale, y_scale);CGContextRotateCTM(ctx, angle / 180.0 * M_PI_2);
图片的裁剪:
先在图像后面画一个形状,然后调用裁剪方法,最后再显示图片,就可以生成裁剪后的图片:
CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50)); CGContextClip(ctx); CGContextFillPath(ctx); UIImage *image = [UIImage imageNamed:@"head"]; [image drawInRect:CGRectMake(0, 0, 50, 50)];
注意是先画一个圆,然后在圆心处放一个与圆的外接正方形重合的图片,这样就可以实现圆型裁剪。
注意先添加图形,再执行裁剪,再显示图形,最后显示图片。
刷帧的方法:多次调用绘图函数
注意drawRect只能由系统调用,手动调用无法获得上下文。
调用view的setNeedsDisplay可以让系统调用。
Tip:如果视图没有改变,调用这个方法仍然会重绘。
Tip:在drawRect方法中调用setNeedsDisplay不会引起死循环。
Tip:从storyboard或者xib初始化完成后会调用awakeFromNib,可以在这里做一些初始化的效果,例如定时器。
Tip:1s以上的使用NSTimer,对于高速刷帧,应该使用CADisplayLink方法。
[CADisplayLink displayLinkWithTarget: ... selector: ... ],用link指针指向它。
添加到消息循环的方法:[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSdefaultRunLoop];
上下文显示到iOS手机屏幕,是通过Layer方式显示的。
Window指的是显示在Mac电脑屏幕上。
通过UIKit也可以调用Quarz2D:不需要主动传上下文。
UIRectFill方法可以画矩形,并且不需要传上下文。
通过创建路径的方式来绘图(涉及到内存管理):
实际上,直接使用ctx也是自动创建一个path,下面的过程通过path来绘图:即使是ARC,也需要使用release。
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 1.创建路径 CGMutablePathRef path = CGPathCreateMutable(); // 2.拼接路径 CGPathMoveToPoint(path, NULL, 0, 0); CGPathAddLineToPoint(path, NULL, 100, 100); // 3.添加路径 CGContextAddPath(ctx, path); // 4.渲染 CGContextStrokePath(ctx); // 5.释放path CGPathRelease(path);
有一个统一的方法,CFRelease,可以释放任何对象。
- (四十八)Quartz2D引擎进阶
- (四十七)Quartz2D引擎初步
- Quartz2D二维绘图引擎
- 11-Quartz2D 二维绘图引擎
- 日拱一卒(四十八)
- (四十八)string类
- 每日英语阅读(四十八)
- 技术分享连载(四十八)
- 杂花生树(四十八)
- 进阶!Quartz2D对UIImage的常用操作
- Quartz2D---苹果官方的⼆维绘图引擎(绘制基本图形)
- Quartz2D-二维绘图引擎 、自定义UI控件
- Quartz2D使用(截屏)
- Quartz2D(4)
- quartz2d
- Quartz2d
- Quartz2D
- Quartz2D
- 杭电hdu_1465_不容易系列之一
- UVA 10229 Modular Fibonacci (矩阵乘法+快速幂)
- uva 10070 Camel trading
- phpstorm和firefox协同调试web(html)+php语句(或web(html)跳转到php语句)
- JUnit单元测试
- (四十八)Quartz2D引擎进阶
- C++primer(第五版)9.3.4节,9.3.5节,9.3.6节练习答案
- js中的数值精度问题
- zoj 1832 file fragmentation
- (记录) sizeclass+autolayout 瞬间让你的工作变的简单轻松,真的会爱上.
- Second price auction - CodeForces 513 C 概率期望
- 【自考】第一遍思维导图(经济学+运筹+操作系统)
- PHP的pcntl多进程
- MyBatis +Spring+TDDL 问答实例