将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;
    }
}

/**
 *@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
    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

时间: 2024-10-11 04:04:58

将UIBezierPath存为自定义格式的字符串,再将字符串转为UIBezierPath的相关文章

laravel 将数组转化成字符串 再把字符串转化成数组

这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组.   方法有点笨, 但是最后是解决了阮少翔的问题 $re1 = DB::table('admin_user') ->join('admin_role_user','admin_user.id','=','admin_role_user.user_id') ->select('admin_role_use

logback自定义格式转换器

创建自定义格式转换符有两步. 首先,必须继承ClassicConverter类.ClassicConverter对象负责从ILoggingEvent 提取信息,并产生一个字符串.例如,LoggerConverter,它是处理“% logger”转换符的转换器,它从ILoggingEvent提取logger 的名字并作为字符串返回. 假设我们的自定义ClassicConverter的功能是按照ANSI终端惯例为记录事件的级别进行着色,下面是一种可能的实现: 示例:样本转换器例子 (src/main

[Java]获取自定义格式的时间

import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import cn.com.agree.ab.t

自定义格式

2.自定义格式 - [email protected] 中国共产 2.1自定义格式 - [email protected] 中国共产 2.1.1自定义格式 - [email protected] 中国共产 2.1.1.1自定义格式 - [email protected] 中国共产 2.1.1.1.1自定义格式 - [email protected] 中国共产 自定义格式 - [email protected] 中国共产 自定义格式 - [email protected] 中国共产  自定义格式

Excel 单元格自定义格式技巧总结

第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式我们可以实现一些看起来非常神奇和有用的效果.下面我们就由浅入深的来介绍一下 Excel 单元格自定义格式的知识和技巧. 1."G/通用格式" 以常规的数字显示,相当于"分类"列表中的"常规"选项. 代码:G/通用格式.10 显示为 10:10.1 显

SQL语句将DateTime 转成自定义格式

DateTime 转成 Date,Time, select update_date = 2007-01-06 16:14:50.437 CONVERT(VARCHAR(30),update_date,111)   =   2007/01/06 CONVERT(VARCHAR(30),update_date,8) =   16:14:50 语句及查询结果:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CON

jqGrid细节备注—jqGrid中自定义格式,URL格式

本文来自:http://cnn237111.blog.51cto.com/2359144/782137 jqGrid中自定义格式,URL格式 当官方自带的showlink用起来不是十分顺手,因此可以考虑自己定义url格式 自定义格式其实很简单,在formatter:处填写函数名 比如formatter:makeURL 那么,可以创建一个makeURL函数. 该函数的签名必须遵循官方的约定,有3个参数. function makeURL(cellvalue, options, rowObject

QTP获取系统时间并自定义格式

function GetDateTime(Nowstr)          Dim Currentdatetime           Dim YY   'Year          Dim MM   'Month          Dim DD   'Day          Dim HH 'Hour          Dim Min  'MInute          Dim SS   'Second          Currentdatetime=now()          YY=Ye

EXCEL 自定义格式(一)

excel2010中内置了很多单元格格式,基本涵盖了数字,文本表示的常用格式.但在有一些情况下仍不能满足我么的需要,所以excel还为我们提供了自定义格式功能.在进入正题之前,请大家看一个示例,下图中C列是我们从某某应用中导出的公司内部用户姓名,但是这个某某系统没有存储用户的电子邮件地址,而在我们自己的报表中又要显示他们的电子邮件,怎么办?当然有办法,直接输入就可以啊,入D2单元格.但如果用户名有上千个,你这样输入岂不是很浪费时间.那么大家可以想到,邮件地址从@之后每隔单元格都是一样的内容,这样