图形绘制-线段绘制相关

最近公司的项目要用到一些图表效果,本来也打算在github上找一些第三方。然而第三方的风格与公司的需求不尽相同,改动起来较麻烦。于是自己写了一个,并且通用化,现已共享至github上。https://github.com/China131/JHChart.git,如有帮组,记得star下哦,😄

以下是自己的一些开发历程。

1.刚起手的时候,想完全用Quartz2D来绘制,然而Quartz2D只能绘制一些基本的图形,并不能达到路径绘制的动画效果。想要完全用UIBezierPath(UIBezierPath实际上也是使用OC语法将Quartz2D封装而成,使用更加方便)绘制,有觉得大材小用了,最终觉得使用Quartz2D绘制基本线条和文本描述,UIBezierPath曲线绘制路径动画过程。注意:Quartz2D是使用CPU渲染的,所以在频繁的绘图(比如在touch move方法里面实时更新图形)是会导致cpu的过高占有率,增加能耗和性能压力。

使用Quartz2D绘制时,建议直接在drawRect方法里面进行,这里面提供了一个图形绘制上下文,可以这样获取

  CGContextRef context = UIGraphicsGetCurrentContext();

  //    移动到点

   CGContextMoveToPoint(context, start.x, start.y);

//从当前上下文点连接到点

  CGContextAddLineToPoint(context, end.x, end.y);

  /*        路径颜色         */

    [color setStroke];

    

    /*        路径闭合区域的填充颜色         */

    [color setFill];

 

//设置线段的虚线样式

   CGFloat ss[] = {0.5,2,1};

//解释下如下方法参数:第一个参数是上下文 第二个参数表示距离线段多少的像素点开始绘制虚线 ,第三个表示虚线的绘制规律数组,如上面的ss数组,表示第一段0.5个像素长度为实线,紧接着2个像素的虚线,再接着1个像素的实线。第四个参数表示如果第三个参数传入数组,则执行绘制的虚线规律数组到第几个。如传入2,表示绘制规律为数组中的前两个元素。

       CGContextSetLineDash(context, 0, ss, 2);

在此强调一点:CGContextSetLineDash中的数组应当使用CGFloat(虽然使用其他类型可能不会报错,但是有可能会导致程序崩溃),不要使用float或者double类型数组,因为在iPhone5s及以下,机型为32位操作系统,以上则为64为操作系统,因此,如果使用了float 或者double类型,在iPhone5s及以下会造成程序崩溃,如下为系统对CGFloat的定义。

#if defined(__LP64__) && __LP64__

# define CGFLOAT_TYPE double

# define CGFLOAT_IS_DOUBLE 1

# define CGFLOAT_MIN DBL_MIN

# define CGFLOAT_MAX DBL_MAX

#else

# define CGFLOAT_TYPE float

# define CGFLOAT_IS_DOUBLE 0

# define CGFLOAT_MIN FLT_MIN

# define CGFLOAT_MAX FLT_MAX

#endif

posted @ 2016-06-30 20:18  Silktree  阅读(203)  评论(0编辑  收藏  举报