ios基本图形绘制

 一.框架的介绍
    Core Graphics Framework是一套基于C的API框架,使用了Quartz(Quartz是苹果开发的API)作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染,该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。

      Quartz 2D在UIKit中也有很好的封装和集成,我们日常开发时所用到的UIKit中的组件都是由Core Graphics进行绘制的。不仅如此,当我们引入UIKit框架时系统会自动引入Core Graphics框架,并且为了方便开发者使用在UIKit内部还对一些常用的绘图API进行了封装。
 
  二 绘图步骤
   1.在uivew上绘图,第一步初创建UIview的子类,调用方法:
-(void)drawRect:(CGRect)Rect;

2.获得上下文的环境,创建一个画布

Graphics Context是图形上下文,可以将其理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,如果要在view上绘图,则将画布放到我们的view中显示即可,view看作是一个画框.

CGContextRef     context=UIGraphicsGetCurrentContext();

3.创建并设置路径
4.将路径添加到上下文
5.设置上下文状态
6.绘制路径

 三  常用的api
  CGContextAddRect(context,rect)   //绘制矩形 

CGContextAddEllipseInRect(context, CGRectMake(x, y, width, height));     //绘制椭圆形

CGContextAddArc(context, 250, 40, 40, 0, 2*PI, 0); //绘制一个圆

CGContextSetLineWidth(context, 2.0);//设置线的宽度

CGContextSetFillColorWithColor(context,color); //填充颜色

CGContextSetStrokeColorWithColor(context,color)//线框颜色

//绘制文字
[Nsstring drawInrect:(CGRect)withattributs:(NSDictionary *)]

//绘制图片
[UIimage drawInrect:(CGRect)] //如果尺寸不合适,会拉伸

[ UIimage drawAsPatternInRect:CGRectMake(x, y, width,height)];//平铺

线条的宽度和线条的虚线样式
CGContextSetLineWidth、CGContextSetLineDash
线条颜色和线条模式
CGContextSetRGBStrokeColor、CGContextSetGrayStrokeColor、CGContextSetStrokeColorWithColor、CGContextSetStrokePattern
填充颜色和模式
CGContextSetRGBFillColor,CGContextSetGrayFillColor,CGContextSetFillColorWithColor, CGContextSetFillPattern
阴影
CGContextSetShadow、CGContextSetShadowWithColor
整体透明度
CGContextSetAlpha(个别颜色也具有alpha成分)
文本属性
CGContextSelectFont、CGContextSetFont、CGContextSetFontSize、CGContextSetTextDrawingMode、CGContextSetCharacterSpacing
是否开启反锯齿和字体平滑
CGContextSetShouldAntialias、CGContextSetShouldSmoothFonts

四 Demo
Example:

-(void)drawRect:(CGRect)Rect;
{
//取得上下文
CGContextRef context=UIGraphicsGetCurrentContext(); 
//路径添加到上下文
CGContextAddRect(context,CGRectMake(140, 120, 60, 30));  
//设置上下文状态:
CGContextSetLineWidth(context, 1.0);
aColor = [UIColor blueColor];
CGContextSetStrokeColorWithColor(context, aColor.CGColor);//线框颜色 
//绘画路径
CGContextDrawPath(context, kCGPathFillStroke);
}

五视图刷新(重绘)
 如果想进行重绘,以下方法可以调用:

1.[self setNeedsDisplay]                            //更新整个视图

2.[self setNeedsDisplayInRect:CGRect]    //更新视图的部分区域。


注意:不能直接调用 drawRect方法去刷新视图,否则会刷新无效

六。图形上下文变换:绘图中的座标系
图形上下文变换:绘图中的座标系

图形上下文变换的作用:平移,缩放,旋转

平移:CGContextTranslateCTM(context,CGFloat x, CGFloat y);

缩放:CGContextScaleCTM(context,CGFloat sx, CGFloat sy);

旋转:CGContextRoateCTM(context,CGFloat x);

在图形上下文变换下,进行补充:
CGContextSaveGState与CGContextRestoreGState的作用

使用Quartz时涉及到一个图形上下文,其中图形上下文中包含一个保存过的图形状态堆栈。在Quartz创建图形上下文时,该堆栈是空的。CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回到之前的图形状态

什么时候该用绘图?

     使用自定义的drawing code一般用在你想要动态的显示内容变化的时候。一般用在游戏或者一些绘图应用中,或者现有的控件ui的样式不满足需求。

  绘图的性能?
  
   Core Graphic控制GPU和CPU之间的数据传输。为了让像素能够显示到屏幕上面,有一些工作是需要CPU的。然后数据会被传给GPU,然后数据再被处理,最后显示到屏幕上面

       1.图代码可能看上去非常的繁琐,但它们是非常快的。
  
       2.iOS绘图系统自身也是非常高效,它不会频繁调用drawRect:方法,除非迫不得已(或调用了setNeedsDisplay方法)
       3.一旦一个视图已由自己绘制完成,那么绘制的结果会被缓存下来留待重用,而不是每次重头再来。(苹果公司将缓存绘图称为视图的位图存储回填(bitmap backing store))

         将代码移到drawRect:方法中是提高性能的普遍做法。这是因为绘图引擎直接对屏幕进行渲染相对于先是脱屏渲染然后再将像素拷贝到屏幕要来的高效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章