图形绘制-线段绘制相关
最近公司的项目要用到一些图表效果,本来也打算在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