1.视图
视图是UIView对象,或是UIView子类对象,视图知道如何绘制自己,视图可以处理事件(touch),视图会按层次结构排列,位于视图层次结构顶端的是应用窗口。
层次结构中的每个视图(包括UIWindow对象)分别绘制自己。视图会将自己绘制到图层(layer)上,每个UIView对象都有一个layer属性,指向一个CALayer类的对象,可以将图层看成是一个位图图像(bitmap image)。
视图Frame参数值的单位是点(points),不是像素。这是为了让视图能够在Retina与非Retina显示器上大小保持一致。同时为了保持应用界面在不同分辨率的屏幕上看起来一致,大小、位置、直线、曲线等都使用点作为单位。
frame和bounds表示的矩形用法不同。frame用于确定与视图层次结构中其他视图的相对位置,从而将自己的图层与其他视图的图层正确组合成屏幕上的图像。而bounds属性用于确定绘制区域,避免将自己绘制到图层边界之外。
“MIN ( value1, value2 )”:取最小值
将图片绘制到视图:
UIImage *logoImage = [UIImage imageNamed:@"logo.png"];
[logoImage drawInRect:someRect];
视图的drawRect:方法在执行之前,系统首先为视图的图层创建一个图形上下文,然后为绘图状态设置一些默认参数。drawRect:方法开始执行时,随着图形上下文不断执行绘图操作,图层上的内容也会随之改变。drawRect:执行完毕后,系统会将图层与其他图层一起组合成完整的图像并显示在屏幕上。
图形上下文阴影:CGContextSetShadow
图形颜色渐变:CGGradientRef
2.运行循环和重绘视图
运行循环的工作是监听事件,当事件发生时,运行循环会为相应的事件找到合适的处理方法。这些处理方法会调用其他方法,而这些方法又会调用更多其他方法,以此类推。只有当这些方法都执行完毕时,控制权才会再次回到运行循环。如果循环收到setNeedDisplay消息的视图,那将会向该视图发送drawRect消息,执行重绘。
iOS做了两方面优化来保证用户界面的流畅性---不重绘显示的内容没有改变的视图;在每次事件处理周期(event handling cycle)中只发送一次drawRect:消息。在事件处理周期中,视图的属性可能会发生多次的改变,如果视图在每次改变时都重绘自己,就会减慢界面的响应速度。相反,iOS会在运行循环的最后阶段集中处理所有需要重绘的视图,尤其是对于属性发生多次改变的视图,在每次事件处理周期中只重绘一次。