将UIBezierPath存为自己定义格式的字符串,再将字符串转为UIBezierPath
<pre name="code" class="objc">自己定义字符串格式为:@"123.02,234.23|321.23,432.0002|543.0003,432.0045|654.0034,567.0034|23.3443,56.0034|77.3440,55.3443|"
/**
*@brief:将BezierPath中的点转为字符串
*/
+ (NSString*)convertBezierPathToNSString:(UIBezierPath*) bezierPath;
{ NSString *pathString = @""; CGPathRef yourCGPath = bezierPath.CGPath;
NSMutableArray *bezierPoints = [NSMutableArray array];
CGPathApply(yourCGPath, (__bridge void *)(bezierPoints), MyCGPathApplierFunc); for (int i = 0; i < [bezierPoints count]; ++i)
{ CGPoint point = [bezierPoints[i] CGPointValue];
pathString = [pathString stringByAppendingString:[NSString stringWithFormat:@"%f",point.x]];
pathString = [pathString stringByAppendingFormat:@"%@",@","];
pathString = [pathString stringByAppendingString:[NSString stringWithFormat:@"%f",point.y]];
pathString = [pathString stringByAppendingString:@"|"]; } return pathString;
} void MyCGPathApplierFunc (void *info, const CGPathElement *element) {
NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info; CGPoint *points = element->points;
CGPathElementType type = element->type; switch(type) {
case kCGPathElementMoveToPoint: // contains 1 point
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
break; case kCGPathElementAddLineToPoint: // contains 1 point
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
break; case kCGPathElementAddQuadCurveToPoint: // contains 2 points
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
break; case kCGPathElementAddCurveToPoint: // contains 3 points
[bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
[bezierPoints addObject:[NSValue valueWithCGPoint:points[2]]];
break; case kCGPathElementCloseSubpath: // contains no point
break;
}
} <pre name="code" class="objc">
/**
*@brief:将字符串中的点转为BezierPath
*/
+ (UIBezierPath*)convertNSStringToBezierPath:(NSString*) bezierPathString
{ NSMutableArray *pointsArray = [[NSMutableArray alloc] init];
NSInteger length = 0; //解析字符串
NSString *separatorString1 = @",";
NSString *separatorString2 = @"|"; NSScanner *aScanner = [NSScanner scannerWithString:bezierPathString]; while (![aScanner isAtEnd]) { NSString *xString, *yString; [aScanner scanUpToString:separatorString1 intoString:&xString];
[aScanner setScanLocation:[aScanner scanLocation]+1]; [aScanner scanUpToString:separatorString2 intoString:&yString];
[aScanner setScanLocation:[aScanner scanLocation]+1]; CGPoint point;
point.x = [xString floatValue];
point.y = [yString floatValue]; [pointsArray addObject:[NSValue valueWithCGPoint:point]]; } //首先将字符串解析为CGPoint数组,再将数组初始化UIBeizerPath
length = [pointsArray count];
UIBezierPath *bezierPath = [[UIBezierPath alloc] init];
[bezierPath moveToPoint:[pointsArray[0] CGPointValue] ];
for (NSUInteger j=1; j< length; j++) {
[bezierPath addLineToPoint:[pointsArray[j] CGPointValue] ];
} return bezierPath;
}
将UIBezierPath存为自己定义格式的字符串,再将字符串转为UIBezierPath的更多相关文章
- python第三十课--异常(异常处理定义格式和常见类型)
演示: 1).异常处理的定义格式: 2).常见的运行时异常类型: try: print(10/0) num=int('132a') except Exception as e: print('出错了. ...
- build.sbt的定义格式
一个简单的build.sbt文件内容如下: name := "hello" // 项目名称 organization := "xxx.xxx.xxx" // 组 ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- Python:Base1(数据类型,print语句,变量,定义字符串,raw字符串与多行字符串,Unicode字符串,整数和浮点数运算,布尔类型运算)
1.Python中数据类型: 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据 ...
- 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(
通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...
- java保存json格式数据,保存字符串和读取字符串
1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...
- Oracle基础 各种语句的定义格式
Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...
- mysql中存不进去json_encode格式的数据
主要是因为json_encode格式的数据,中间带有\,在存入数据库的时候,会把反斜杠删除了. 所以,想要存进去的话,需要在外层调用一下函数addslashes();这个函数会在每个反斜杠的前面添加反 ...
- 测试Protobuffer的定义格式对其时间和空间的影响
测试Protobuffer格式的A命令转换为std::string的的字节个数,分别测试了工程中用到的几种命令: a)AddLayer:108 b)AddSource:209 c)MoveLayer: ...
随机推荐
- 【Luogu】P3787冰精冻西瓜(线段树)
题目链接 我脑子怕不是有坑qwqqq 用前缀和思想,dis[i]表示i离根的距离,那么修改操作其实是对x的子树区间加y/dis[x],查询的时候*dis[to]即可. 对付/0错的思路是建森林,然而这 ...
- Java面试题之Java中==和equals()和hashCode()的区别
“==”: ==是运算符,用来比较两个值.两个对象的内存地址是否相等: “equals()”: equals是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过“==”来实现 ...
- hust 1605 - Gene recombination(bfs+字典树)
1605 - Gene recombination Time Limit: 2s Memory Limit: 64MB Submissions: 264 Solved: 46 DESCRIPTION ...
- APUE 学习笔记(一) Unix基础知识
1. Unix 体系结构 内核的接口被称为系统调用 公用函数库构建在系统调用接口之上 应用软件既可以调用公用函数库,也可以直接进行系统调用 2. 文件和目录 目录操作函数:opendir--- ...
- 单击gridview中的选择按钮跳转到另一个页面的方法
原文发布时间为:2008-07-24 -- 来源于本人的百度文章 [由搬家工具导入] 单击gridview中的选择按钮跳转到另一个页面的方法: 在gridview的事件中双击 SelectedInde ...
- touch下拉刷新
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 两个 DataTable 读取重复数据
今天正好用到Excel 导入转换成table , 文件中数据要和数据库里数据进行比对,有重复的抛出重复数据. 和大家分享下,欢迎高手留言指点.有问题可以留言关注! /// <summary> ...
- 小程序-引用其他js文件
我也是小白菜,之所以有这个记录是因为我做项目时遇到了这个问题 流程: 1.需要建立一个js文件 content.js function myContent() { console.log(&quo ...
- js -“=”“==”和“===”的区别
这个问题再面试中经常被问到,说实话我都是懵的,一个“=”和两个“==”等的区别我还是知道的,就是三个“===”我完全是不知道的,因为我基本上都没有遇到过且用到过,所以再这个问题上我是没分的,人家考官就 ...
- spring-aop AnnotationAwareAspectJAutoProxyCreator类
类图结构如上所示.