关于 IOS中 绘制图形的问题

关于 IOS中 绘制图形的问题

 

在 IOS 中 自定义控件

 

绘图,图表,progress  都可以去绘制,绘制的思路很重要。

 

Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics。

 

共有两种部分组成Quartz:

Quartz Compositor,合成视窗系统,管理和合成幕后视窗影像来建立Mac OS X使用者接口。

Quartz 2D,是iOS和Mac OS X环境下的二维绘图引擎。

涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理,防锯齿渲染,生成PDF,以及PDF元数据相关处理。

 

CoreGraphics.framework  框架 帮助你创建图形

 

Quartz Core 包含了  Core Animation 框架 接口 (主要是有一个layer层的操作)

 

Quartz坐标

Quartz技术最开始为Mac OS X系统设计的图形技术,它的坐标原点位于左下角。

 

UIKit坐标

 

UIKit坐标与Quartz不同,原点位于右上角。在iOS中的UIView等控件都是基于此坐标,由于在UIView使用了Quartz坐标有时候需要转换。

 

/////////////////////************

UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以。UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。

 

UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

 

UIView 调用setNeedsDisplay会自动调用drawRect

重写drawRect,调用setNeedsDisplay。不需要手动调用drawRect

 

1.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。2.该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。3.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。4.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0.以上1,2推荐;而3,4不提倡

 

CALyer 层绘图

1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect ,让系统自动调该方法。2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法。3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕 (不能使用手势来画图

 

CGPath  CGContext

UIKit默认的坐标系统与Quartz不同。在UIKit中,原点位于左上角,y轴正方向为向下。UIView通过将修改Quartz的Graphics Context的CTM[原点平移到左下角,同时将y轴反转(y值乘以-1)]以使其与UIView匹配

posted on 2013-10-18 09:52  kevingod  阅读(496)  评论(0编辑  收藏  举报

导航