如何使用一个 UIBezierPath 创建两个不同颜色的笔画

How to create two strokes of different color using one UIBezierPath

我正在尝试用手指在 UIView 上画线,并且使用一种颜色效果很好。如果我尝试更改颜色并再次绘制,之前的 UIBezierPath 颜色也会更改为新颜色。因此,我无法在 UIView

上绘制一条不同的颜色线,同时保留之前的颜色线

我在 UIView

中将所有属性(路径、线条颜色)设置为非原子和强

供参考:

我的第一次抽奖:

我的第二次开奖:

我的第三次开奖:

选择颜色后,我在颜色选择器委托方法中更改了 UIView 的描边颜色:

#pragma mark - FCColorPickerViewControllerDelegate Methods

-(void)colorPickerViewController:(FCColorPickerViewController *)colorPicker didSelectColor:(UIColor *)color {

      self.drawView.lineColor = color; //this works fine 

 //    self.drawView.path=[UIBezierPath bezierPath];  tried this to create new bezier path with new color, but this erases the olde bezier path and return new
//    [self.drawView.lineColor setStroke];     tried this
//    [self.drawView.lineColor setFill];  tried this

      [self dismissViewControllerAnimated:YES completion:nil]; //dismiss the color picker
}

以下是我的绘图视图方法:

- (id)initWithCoder:(NSCoder *)aDecoder 
{
    if (self = [super initWithCoder:aDecoder])
    {
        [self setBackgroundColor:[UIColor whiteColor]];
        path = [UIBezierPath bezierPath];
        [path setLineWidth:self.lineWidth];
    }
    return self;
}

- (void)drawRect:(CGRect)frame 
{
    [self.lineColor setStroke];

    [path stroke];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UITouch *touch = [touches anyObject];
        CGPoint p = [touch locationInView:self];
        [path moveToPoint:p];
    });

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   dispatch_async(dispatch_get_main_queue(), ^{
       UITouch *touch = [touches anyObject];
       CGPoint p = [touch locationInView:self];
       [path addLineToPoint:p];
       [self setNeedsDisplay];
   });
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self touchesMoved:touches withEvent:event];
}

我试过 this: 将旧的贝塞尔曲线路径添加到数组并重新绘制它们,但它没有用,这次我不能用新颜色制作另一个贝塞尔曲线路径。:

       - (void)drawRect:(CGRect)frame // (5)
{
    //load the path from array
    for (int i = 0; i < [pathArray count]; i++){


        NSLog(@"Path: %@",[pathArray objectAtIndex:0]);
        NSLog(@"Color: %@",[pathArray objectAtIndex:1]);

        UIBezierPath *oldpath = [pathArray objectAtIndex:0];

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

        //path
        [oldpath stroke];
    }

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

}

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

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

    return newpath;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UITouch *touch = [touches anyObject];
        CGPoint p = [touch locationInView:self];
        [path moveToPoint:p];
        startPoint=p;
    });

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   dispatch_async(dispatch_get_main_queue(), ^{
       UITouch *touch = [touches anyObject];
       CGPoint p = [touch locationInView:self];
       [path addLineToPoint:p]; // (4)
       endPoint=p;

       [self setNeedsDisplay];
   });
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self touchesMoved:touches withEvent:event];

    [pathArray addObject:path];
    [pathArray addObject:lineColor];

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self touchesEnded:touches withEvent:event];
}

实际上你不能用不同的颜色描画同一路径的不同部分。

您可以将绘图上下文视为状态机。每次您发出绘制命令(例如在 UIBezierPath 上调用 stroke)时,它会检查当前的 stroke/fill 颜色并使用它来执行绘制。要创建不同颜色的多个笔划,您需要有多个笔划路径,并在每次调用 stroke.

之间设置笔划颜色
- (void)drawRect:(CGRect)frame {
    UIBezierPath* pathOne = // create path one
    UIBezierPath* pathTwo = // create path two
    UIBezierPath* pathThree = // create path three

    [[UIColor redColor] setStroke];
    [pathOne stroke];

    [[UIColor greenColor] setStroke];
    [pathTwo stroke];

    [[UIColor blueColor] setStroke];
    [pathThree stroke];
}