UIBezierPath多行颜色

时间:2013-02-15 21:25:52

标签: objective-c nsmutablearray nsarray uibezierpath

我尝试绘制不同颜色的UIBezierPath行是让我失望的。所有行都更改为当前选定的颜色。我的所有路径和信息都存储在名为pathInfo的NSMutableArray中。在路径信息中,我放入包含路径,颜色,宽度和行类型的数组。除了所有线条都变成用户选择的任何颜色之外,这种方法都很好。我非常感谢任何帮助!

- (void)drawRect:(CGRect)rect {
    UIBezierPath *drawPath = [UIBezierPath bezierPath];
    drawPath.lineCapStyle = kCGLineCapRound;
    drawPath.miterLimit = 0;

    for (int i = 0; i < [pathInfo count]; i++){
        NSArray *row = [[NSArray alloc] initWithArray:[pathInfo objectAtIndex:i]];
        NSLog(@"Path: %@",[row objectAtIndex:0]);
        NSLog(@"Color: %@",[row objectAtIndex:1]);
        NSLog(@"Width: %@",[row objectAtIndex:2]);
        NSLog(@"Type: %@",[row objectAtIndex:3]);

        //width
        drawPath.lineWidth = [[row objectAtIndex:2] floatValue];

        //color
        [[row objectAtIndex:1] setStroke];

        //path
        [drawPath appendPath:[row objectAtIndex:0]];

    }

   UIBezierPath *path = [self pathForCurrentLine];
    if (path)
     [drawPath appendPath:path];

   [drawPath stroke];
}

- (UIBezierPath*)pathForCurrentLine {
    if (CGPointEqualToPoint(startPoint, CGPointZero) && CGPointEqualToPoint(endPoint, CGPointZero)){
        return nil;
    }

    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPoint];
    [path addLineToPoint:endPoint];

    return path;

}

2 个答案:

答案 0 :(得分:3)

笔触/填充颜色仅影响-stroke命令。它们不会影响-appendPath:命令。路径不包含每段颜色信息。

如果您需要多色线条,则需要单独描边每种颜色。

答案 1 :(得分:2)

设置笔触颜色(以及你有什么颜色),然后设置stroke,然后移到下一个路径:

- (void)drawRect:(CGRect)rect
{
    for (int i = 0; i < [pathInfo count]; i++){
        NSArray *row = [[NSArray alloc] initWithArray:[pathInfo objectAtIndex:i]];

        NSLog(@"Path: %@",[row objectAtIndex:0]);
        NSLog(@"Color: %@",[row objectAtIndex:1]);
        NSLog(@"Width: %@",[row objectAtIndex:2]);
        NSLog(@"Type: %@",[row objectAtIndex:3]);

        UIBezierPath *path = [row objectAtIndex:0];

        path.lineCapStyle = kCGLineCapRound;
        path.miterLimit = 0;

        //width
        path.lineWidth = [[row objectAtIndex:2] floatValue];

        //color
        [[row objectAtIndex:1] setStroke];

        //path
        [path stroke];
    }

    UIBezierPath *path = [self pathForCurrentLine];
    if (path)
    {
        // set the width, color, etc, too, if you want
        [path stroke];
    }
}