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

时间:2015-10-13 16:52:23

标签: ios objective-c uiview uibezierpath

我正试图用手指在UIView上画线,并且它可以用一种颜色很好地工作。如果我尝试更改颜色并再次绘制,则之前的UIBezierPath颜色也会更改为新颜色。因此,我无法绘制不同的颜色线,保留UIView

上的上一个颜色线

我在UIView

中将所有属性(路径,linecolor)设置为非原子和强大

供参考:

我的第一次抽奖:enter image description here

我的第二次抽奖:enter image description here

我的第三次抽奖:enter image description here

选择颜色后,我在颜色选择器委托方法中更改了我的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:将旧的bezier路径添加到数组中并重绘它们,但它没有用,这次我不能用新颜色创建另一个贝塞尔路径。:

       - (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];
}

1 个答案:

答案 0 :(得分:5)

您实际上无法以不同的颜色描绘同一路径的不同部分。

您可以将绘图上下文视为状态机。每次发出绘图命令(例如在stroke上调用UIBezierPath)时,它都会检查当前的笔触/填充颜色并使用它来执行绘制。要创建不同颜色的多个笔划,您需要有多个笔划路径,并在每次调用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];
}