IOS深入学习(5)之Drawing Model
1 前言
今天我们来学习一下IOS中的绘图模型。
2 详述IOS和OS X中的绘图模型遵循两种技术途径中的其中一种,基于一种根据要求更新外观的模式。
·OpenGL:OpenGL是一个为了在台式机创建2D和3D内容的基于C语言的接口。他是为了沉浸式应用程序,例如游戏,或者需要高分辨率画面的应用程序而设计的。对于OS X,有一个OpenGL 框架的桌面版本;对于IOS来说,有OpenGL ES框架,用来优化嵌入式系统的使用。
·Native support:Quartz(Core Graphics),Core Animation,和对于每一个平台(UIKit和AppKit)的应用程序框架都提供了使用面向对象的模式的本地绘图支持。Quartz是主要的绘图接口,提供了基本路径绘图支持,消除锯齿渲染,样式填充渐变,图像,颜色,坐标空间的转换,和PDF文档的创建,显示和解析。我们可以使用Core Animation动态的改变许多视图的属性和实现自定义的动画。UIKit和AppKit都包含了代表绘图实体例如图像,颜色和贝塞尔曲线路径的Objective-C类。他们也提供了绘制文字和简单图形的支持。
常常当OpenGL渲染使用被应用框架UIKit和AppKit定义的视图类的时候,某些绘图模型和本地渲染和相似。然而,OpenGL应用不一定非要基于视图。
2.1 视图在必要时通过drawRect:方法绘制自己绘图的主要元素是根据要求更新内容。一个视图绘制自己的内容通过drawRect:方法,该方法在视图的基类(UIView和NSView)声明并且在子类中重写。传入方法的矩形区域标识着视图需要重绘的区域。视图第一次出现在window中,矩形区域匹配视图的bounds而且视图绘制了他的所有内容。随后如果有必要视图绘制他自己仅仅需要改变的部分。
可能会引起视图的更改的几种行为:
·通过视图的hidden属性设置为NO的编码方式使预先隐藏视图的变为可见。
·通过编码明确的作废一个视图,因此标记他为重绘,我们可以在视图中调用例如setNeedsDisplay和setNeedsDisplayInRect的方法。
·对于没有Layer支持的视图,用户添加或者移除一个被另一个视图部分隐藏的视图。
·对于没有Layer支持的视图,用户滚动视图离开滚动视图包含的部分然后将其滚动回来。
核心图层的存在视图的绘画行为。图层允许一个视图缓存他的内容在可以不使用额外请求的绘制就可以被操作位图中,所有的IOS视图都是图层支持的。
在主事件循环的结尾,窗口处理它的视图的层级关系然后要求这些视图重绘他们自己通过调用drawRect:方法。
UIView自动配置了绘制视图的环境在“drawRect:”方法被调用之前。作为配置信息的一部分,view类创建了Graphics Context为当前的绘图环境。
Graphics Context是包含了绘图系统所需要的信息的Quartz对象(CGContext)。例如被接受的颜色,绘制的模型(填充的笔画),线条的宽度和样式信息,字体信息和合成选项。Graphics Context对象是和窗口,位图,PDF文件或者其他输出设备和关于实体的当前绘制环境状态的操作信息关联在一起的。视图绘制使用与视图窗口关联的Graphics Context。对于一个视图来说,Graphics Context设置了默认的裁剪区域来符合视图的bounds并且使默认的绘制原点置于视图边界的原点处。
视图绘制本身与本地坐标系统。视图的“bounds”属性提供点的位置在坐标系统中。
我们可以改变视图的默认的坐标系统通过修改当前变化模型(CTM.current transformation matrix)。CTM映射点到一个视图坐标系统中的点在设备的屏幕上。通过改变CTM,我们可以修改关系到它的父视图或者窗口的视图坐标系统中的大小,方向和位置,由此由此缩放,旋转或者移动视图。
绘图命令涉及到被用户坐标空间所了解的混合和比例的绘制空间。操作系统映射坐标单元在绘图空间中到符合目标设备的实际像素之上。因此向量命令被发行通过对于设备的任何分辨率视图规模,这些命令指定绘制坐标通过浮点值来获取精度来请求绘图的基本向量。
3 结语以上是所有内容,希望对大家有所帮助。