Как нарисовать несколько UIBezierPath с разными цветами в UIView - PullRequest
10 голосов
/ 21 июня 2011

Я хотел бы нарисовать несколько UIBezierPath в UIView с другим цветом обводки и заливки.

Вот код

- (void)drawRect:(CGRect)rect {

    context = UIGraphicsGetCurrentContext();

    [[UIColor grayColor] setFill]; 
    [[UIColor greenColor] setStroke];

    UIBezierPath *aPath = [[UIBezierPath alloc] init]; 
    [aPath moveToPoint:CGPointMake(227,34.25)];
    [aPath addLineToPoint:CGPointMake(298.25,34.75)];
    [aPath addLineToPoint:CGPointMake(298.5,82.5)];
    [aPath addLineToPoint:CGPointMake(251,83)];
    [aPath addLineToPoint:CGPointMake(251,67.5)];
    [aPath addLineToPoint:CGPointMake(227.25,66.75)];   
    [aPath closePath]; 
    aPath.lineWidth = 2;
    [aPath fill]; 
    [aPath stroke];

    UIBezierPath *aPath2 = [[UIBezierPath alloc] init];
    [aPath2 moveToPoint:CGPointMake(251.25,90.5)];
    [aPath2 addLineToPoint:CGPointMake(250.75,83.25)];
    [aPath2 addLineToPoint:CGPointMake(298.5,83)];
    [aPath2 addLineToPoint:CGPointMake(298.5,90.25)];
    [aPath2 closePath];
    aPath2.lineWidth = 2;
    [aPath2 fill]; 
    [aPath2 stroke];
    [paths addObject:aPath2];

Проблема в том, что обводка и цвет заливкиустановить в текущем контексте.Можно ли нарисовать разные UIBezierPath разными цветами в одном и том же CGContextRef?

Или мне нужно нарисовать каждый UIBezierPath в отдельном UIView?

Ответы [ 3 ]

24 голосов
/ 21 июня 2011

Вы должны добавить

[desiredStrokeColor setStroke];
[desiredFillColor setFill];

, указывая, что это новые цвета, которые должны использоваться в дальнейшем в этом контексте.Это следует делать перед каждым вызовом

[aNewPath fill];
[aNewPath stroke];

, чтобы пути были нарисованы этими цветами.

Нет необходимости использовать новый вид для каждого пути Безье.

8 голосов
/ 01 августа 2012

используйте это

int count = 0;
for(UIBezierpath *_paths in pathArray)
{
   UIColor *_color = [delegate1.colorArray objectAtIndex:q];
   [_color setStroke];
   [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
   count++;
}

На связи начали хранить ваши пути и цвета в двух массивах и использовать их в DrawRight, как указано выше.

5 голосов
/ 27 ноября 2012

Просто определите UIColor * setStroke; в .h файле и установите этот объект strokeColor перед вызовом [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];

 - (void)drawRect:(CGRect)rect
    {
        [strokeColor setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
        for(UIBezierPath *_path in pathArray)
            [myPath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
    }

    #pragma mark - Touch Methods
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        myPath=[[UIBezierPath alloc]init];
        myPath.lineWidth = currentSliderValue;

        UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
        [myPath moveToPoint:[mytouch locationInView:self]];
        [pathArray addObject:myPath];
    }
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
        [myPath addLineToPoint:[mytouch locationInView:self]];
        [self setNeedsDisplay];

    }
...