Как заполнить цвет внутри UIBezierPath?

Я рисую фигуру с помощью UIBezierPath в touchesMoved.

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    secondPoint = firstPoint;
    firstPoint = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

    CGPoint mid1 = midPoint(firstPoint, secondPoint);
    CGPoint mid2 = midPoint(currentPoint, firstPoint);

    [bezierPath moveToPoint:mid1]; 
    [bezierPath addQuadCurveToPoint:mid2 controlPoint:firstPoint];

    [self setNeedsDisplay]; 
}

Я хочу заполнить его КРАСНЫМ цветом после closePath, но не могу. Пожалуйста помоги!

- (void)drawRect:(CGRect)rect
{
    UIColor *fillColor = [UIColor redColor];
    [fillColor setFill];
    UIColor *strokeColor = [UIColor blueColor];
    [strokeColor setStroke];
    [bezierPath closePath];
    [bezierPath fill];
    [bezierPath stroke]; 
}

person LE SANG    schedule 12.03.2013    source источник
comment
Не похоже, что вы на самом деле гладите дорожку, поэтому закрывать нечего.   -  person Abizern    schedule 12.03.2013
comment
Не могли бы вы дать ответ. Я не очень понимаю. Спасибо!   -  person LE SANG    schedule 12.03.2013
comment
Дай угадаю? вы не получаете форму, только линию? Каждый раз, когда ваше касание перемещается, оно закрывает текущий подпуть.   -  person Abizern    schedule 12.03.2013
comment
Да сэр! только синяя линия. Я так понимаю closePath сделать фигуру? Очень плохой.   -  person LE SANG    schedule 12.03.2013
comment
Ваш код в порядке, за исключением того, что setFill фактически не устанавливает контекст заполнения, как вы ожидаете (см. это: stackoverflow.com/questions/10623545/). Вместо этого установите заливку с эквивалентом obj-C let context = UIGraphicsGetCurrentContext()!; context.setFillColor(UIColor.blue.cgColor)   -  person pseudosudo    schedule 13.11.2018


Ответы (2)


Если у вас есть путь Безье, хранящийся в другом месте, это должно работать:

Изменить

Глядя на ваш отредактированный код, происходит то, что когда вы закрываете путь, который вы рисуете, закрывается, поэтому вы получаете линию, а не форму, поскольку у вас есть только две точки.

Один из способов обойти это — создать путь по мере перемещения ваших точек, но обвести и заполнить копию этого пути. Например, это непроверенный код, я пишу его напрямую

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    secondPoint = firstPoint;
    firstPoint = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

    CGPoint mid1 = midPoint(firstPoint, secondPoint);
    CGPoint mid2 = midPoint(currentPoint, firstPoint);

    [bezierPath moveToPoint:mid1]; 
    [bezierPath addQuadCurveToPoint:mid2 controlPoint:firstPoint];

    // pathToDraw is an UIBezierPath * declared in your class
    pathToDraw = [[UIBezierPath bezierPathWithCGPath:bezierPath.CGPath];

    [self setNeedsDisplay]; 
}

И тогда ваш код рисования может:

- (void)drawRect:(CGRect)rect {
    UIColor *fillColor = [UIColor redColor];
    [fillColor setFill];
    UIColor *strokeColor = [UIColor blueColor];
    [strokeColor setStroke];

    // This closes the copy of your drawing path.
    [pathToDraw closePath];

    // Stroke the path after filling it so that you can see the outline
    [pathToDraw fill]; // this will fill a closed path
    [pathToDraw stroke]; // this will stroke the outline of the path.

}

Есть некоторая уборка, чтобы сделать touchesEnded, и это можно было бы сделать более производительным, но вы поняли идею.

person Abizern    schedule 12.03.2013
comment
Как заполнить цвет для закрытого безирепа на CAShapelayer. У меня он всегда черного цвета. - person Madhu; 23.01.2015

Вы должны сохранить массив ваших UIBezierPaths. Попробуйте этот код,

 - (void)drawRect:(CGRect)rect
    {

        for(UIBezierPath *_path in pathArray){


         [_path fill];
        [_path stroke];
        }
    }

    #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];

    }
person Hasintha Janka    schedule 12.03.2013
comment
Это не отвечает на вопрос о заполнении пути. Это просто готовый код для рисования линии касаниями. - person Abizern; 12.03.2013
comment
код в drawrect — это код, который используется для заполнения чертежа. - person Hasintha Janka; 12.03.2013