zoukankan      html  css  js  c++  java
  • 将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;
    }


    
    
  • 相关阅读:
    Elasticsearch入门系列(一)
    清楚Chrome缓存
    解决IIS启动站点报错
    Input type="file"上传文件change事件只触发一次解决方案
    本地计算机上的XXX服务启动后停止,某些服务在未由其它服务或程序使用时将自动停止
    SQL Server Datetime类型为NULL不能用ISNULL(datetime,' ')来判断,会导致1900-01-01
    浏览指南
    谁发明的c++
    c++的用处
    不一样的二叉树遍历(小学生都会)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7207728.html
Copyright © 2011-2022 走看看