ios开发之使用CorePlot绘制折线图并添加拖动功能

       做ios开发快两个月了 从基本的语法开始学起看看这个学学那个的。一开始对delegate controller view各种头大,就老老实实地跟着入门教程一步步的来。所幸之前做了一年多的java开发,熟悉了eclipse的界面和Deja的字体,换到mac下面用xcode也觉得很新鲜。

      感觉做ios开发这一块对内存管理要求还是不低的,因为之前做java,对这一块基本不怎么关心,突然转到ios上的时候在内存管理上还是犯过几次错误的。开始学习的时候看书上说谁创建谁释放,就简单的以为但凡创建出来的对象都要显式地去release,后来果然出过一次诡异的错误,修正之后对内存管理就更加用心地去学习了,这一块有时间后面再讨论,现在先把这几天对coreplot的使用记录一下,以备后用。

公司的需求是对数据解析进行折线图绘制,并且用户可以通过触摸调整数据点通过公式计算使折线图重新绘制。数据与公式都是服务器端获取的并且是打包成了一个json的字符串。这里面还牵扯到了字符串解析成公式的问题。上网搜了下,oc下并没有很好的解决方案,像这样做的话似乎只能自己写方法,让我想起了上学时候学编译原理写过的语法树,满满的都是泪啊~妥妥的能不写就不写。后来公司大牛说有js引擎可以拿过来用,因为公司这边也有做网页端的折线图绘制,在js下公式转换异常简单

var fun=new fun(str);
fun();

如上所示,两行代码就把str代表的字符串公式解析并计算一遍了,实在是太无解了,妥妥必须使用,这个东西下篇文章再讲吧。

图像绘制的话google出来ios上比较常用的是CorePlot和PowerPlot,看了下两者的用法,感觉CorePlot会使用更多的代理之类的东西,感觉比较符合苹果的编码思路,就选了它来用了。

首先是下载coreplot库,把.a文件和头文件引入,这里就不赘述了。

先在头文件里定义几个后面要用到的量

//转换坐标系字典,与手指触摸点匹配
@property (nonatomic,retain) NSMutableDictionary *reverseDic;
//js引擎上下文
@property (nonatomic) JSGlobalContextRef context;
//绘图view
@property (nonatomic,retain) CPTGraphHostingView *hostView;

//坐标转换方法,实际坐标转化相对坐标
- (CGPoint)CoordinateTransformRealToAbstract:(CGPoint)point;
//坐标转换方法,相对坐标转化实际坐标
- (CGPoint)CoordinateTransformAbstractToReal:(CGPoint)point;
//判断手指触摸点是否在折点旁边
-(BOOL)isNearByThePoint:(CGPoint)p;

//js代码运行
- (NSString *)runsJS:(NSString *)aJSString;

因为要对图像上的折点拖动,而我没有找到合适的对点的事件绑定方法,所以先直接对整个view进行手势监听,通过实际坐标与坐标轴坐标相对转换来判定触摸点是否是在折点附近已达到合理拖动的目的。

接下来便开始.m文件的编码工作啦。我先定义一个简单的折线图公式,y=x+n;把一些数据点塞到point数组里,做后面的datasource。接下来便是折线图的绘制,代码注释写得比较清楚,就不一一赘述了。值得注意的是,这里点的绘制也是使用ios里常用的datasource的方法,所以先别急着找那一系列点出现在哪里~<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用CoreImage框架,也可以使用ZBarSDK来获取图片中二维码的定位。 1. 导入ZBarSDK: 在项目中导入ZBarSDK,并在需要使用的文件中引入头文件: ``` #import "ZBarSDK.h" ``` 2. 加载图片: ``` UIImage *image = [UIImage imageNamed:@"image.png"]; CGImageRef imageRef = image.CGImage; ``` 3. 创建ZBarImageScanner并设置识别类型: ``` ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init]; [scanner setSymbology: ZBAR_QRCODE config: ZBAR_CFG_ENABLE to: 1]; ``` 4. 将图片转换为ZBarImage对象: ``` ZBarImage *zbarImage = [[ZBarImage alloc] initWithCGImage:imageRef]; ``` 5. 扫描二维码: ``` [scanner scanImage:zbarImage]; ``` 6. 遍历扫描结果,获取二维码定位: ``` for (ZBarSymbol *symbol in scanner.results) { NSArray *corners = symbol.bounds; // 获取定位四个角的坐标 // 在图像上绘制定位 UIGraphicsBeginImageContext(imageSize); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextSetLineWidth(context, 2.0); CGContextMoveToPoint(context, corners[0].x, corners[0].y); CGContextAddLineToPoint(context, corners[1].x, corners[1].y); CGContextAddLineToPoint(context, corners[2].x, corners[2].y); CGContextAddLineToPoint(context, corners[3].x, corners[3].y); CGContextAddLineToPoint(context, corners[0].x, corners[0].y); CGContextStrokePath(context); UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } ``` 这样就可以在原图上绘制出二维码的定位了。需要注意的是,ZBarSDK是第三方框架,需要先在官网注册并获取授权才能使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值