在IOS中绘图技术主要包括:UIKit、Quartz 2D、Core Animation和OpenGL ES。其中Core Animation提供动画实现技术,OpenGL ES是OpenGL针对嵌入式设备的简化版本,用以绘制高性能的2D和3D图形。这里主要UIKit和Quartz 2D。
在IOS上无论采用哪种绘图技术(UIKit、Quartz 2D、Core Animation和OpenGL ES),都离不开UIView,绘制都发生在UIView对象的区域内。在绘制发生的时候如果使用的是系统提供的视图,绘制工作会自动得到处理。然而,如果是自定义视图,则必须重写drawRect:方法,在此提供相应的绘制代码。一旦drawRect:方法被调用,就可以使用任何的UIKit、Quartz 2D、OpenGL ES等技术对视图的内容进行绘制了。
绘图过程中除了使用了drawRect:方法,还有setNeedsDisplay和setNeedsDisplayInRect:。setNeedsDisplay和setNeedsDisplayInRect:方法是设置视图或者视图部分区域是否需要重新绘制,setNeedsDisplay是重新绘制整个视图,setNeedsDisplayInRect是重新绘制视图的部分区域。原则上,尽量不要绘制视图的全部,以减少绘制带来开销。触发视图重新绘制的动作有如下几种:
UIKit提供非常基本的绘图功能,主要的API有: - UIRectFill(CGRect rect),填充矩形函数 - UIRectFrame(CGRect rect),矩形描边函数 - UIBezierPath,绘制常见路径类,包括险段、渐变、阴影、反锯齿等高级特性支持还是不及Quartz 2D。
[str drawAtPoint:CGPointZero withAttributes:nil];
drawAtPoint: withAttributes:底层也是同样也是按以下着步骤来的:
所以,不管有没有上下文,只要在View上面画东西,都得要在DrawRect方法中去写
通过绘制方法的最后一个属性withAttributes来设置文字属性,它要求传入的是一个字典.它是通过字典的key和Value的形式来设置文字样式.。那传什么key,什么值我们可以在UIKit头文件当中的NSAttributedString类当中去找。使用形式如下:
- (void)drawRect:(CGRect)rect {
NSString *str = @"打印信息 打印信息";
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//字体
dict[NSFontAttributeName] = [UIFont systemFontOfSize:50];
//颜色
dict[NSForegroundColorAttributeName] = [UIColor redColor];
//设置边框颜色
dict[NSStrokeColorAttributeName] = [UIColor redColor];
dict[NSStrokeWidthAttributeName] = @1;
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowOffset = CGSizeMake(10, 10);
shadow.shadowColor = [UIColor greenColor];
shadow.shadowBlurRadius = 3;
dict[NSShadowAttributeName] = shadow;
//Attributes:给文字添加一些属性,富文本
[str drawAtPoint:CGPointZero withAttributes:dict];
}
6、drawAtPoint:和drawInRect:的区别?
在前面我们学会了如何在自定义view中绘制文本信息,其实绘制图片的方法绘制文本的方法非常类似,所以基本步骤如下:
绘制图片的方法有三种,其区别分别如下:
//会填充整个rect的区域,指定的裁剪不会有效
UIRectClip(CGRectMake(0, 0, 50, 50));
UIRectFill(rect);
//只会填充指定的裁剪区域,其他部分不会填充
UIRectFill(rect);
UIRectClip(CGRectMake(0, 0, 50, 50));