2013-11-08 5 views
3

Я хочу нарисовать треугольник с заданным цветом линии, толщиной строки и цветом заливки. Но некоторые, как я не получу треугольник, чтобы правильно заполнить. Каждый раз, когда заполняется вся область вокруг треугольника.Нарисуйте цветной треугольник в ios

Это мой код:

+ (UIImage *) drawColorTriangleWithBorderWidth:(int)Width Height:(int)Height R:(int)R G:(int)G B:(int)B A:(int)A BorderR:(int)BR BorderG:(int)BG BorderB:(int)BB BorderA:(int)BA Thickness:(CGFloat)thickness { 

    if (Width == 0 || Height == 0) return nil; 

    float de = thickness/2.0; 

    UIGraphicsBeginImageContext(CGSizeMake(Width+de, Height+de)); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(context);  

    CGFloat rr = 1.0*R/255.0; if (rr > 1.0) rr = 1.0; 
    CGFloat gg = 1.0*G/255.0; if (gg > 1.0) gg = 1.0; 
    CGFloat bb = 1.0*B/255.0; if (bb > 1.0) bb = 1.0; 
    CGFloat aa = 1.0*A/100.0; if (aa > 1.0) aa = 1.0; 

    CGFloat brr = 1.0*BR/255.0; if (brr > 1.0) brr = 1.0; 
    CGFloat bgg = 1.0*BG/255.0; if (bgg > 1.0) bgg = 1.0; 
    CGFloat bbb = 1.0*BB/255.0; if (bbb > 1.0) bbb = 1.0; 
    CGFloat baa = 1.0*BA/100.0; if (baa > 1.0) baa = 1.0; 

    CGContextSetLineCap(context, kCGLineCapSquare); 
    CGContextSetRGBFillColor(context, rr, gg, bb, aa); 
    CGContextSetLineWidth(context, thickness); 
    CGContextSetRGBStrokeColor(context, brr, bgg, bbb, baa); 

    CGContextMoveToPoint(context, Width/2.0, de); 
    CGContextAddLineToPoint(context, de, Height-de); 
    CGContextAddLineToPoint(context, Width-de, Height-de); 
    CGContextAddLineToPoint(context, Width/2.0, de); 
    CGContextDrawPath(context, kCGPathFillStroke); 

    UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 

Кто может мне помочь? Спасибо.

+1

Примечание: 'CGFloat rr = 1,0 * R/255,0; if (rr> 1.0) rr = 1.0; 'может быть более простым:' CGFloat rr = MIN (R/255.0, 1.0); ' – zaph

+0

Вместо последнего' CGContextAddLineToPoint' просто используйте 'CGContextClosePath'. – Wain

+0

Почему вы используете переменные с заглавной буквы? – fnc12

ответ

2

Вы должны закрыть путь после добавления различных путей:

CGContextMoveToPoint(context, Width/2.0, de); 
CGContextAddLineToPoint(context, de, Height-de); 
CGContextAddLineToPoint(context, Width-de, Height-de); 
CGContextClosePath(context); 
CGContextFillPath(context); 
+0

В документации 'CGContextFillPath()' явно указано: «Кварц рассматривает каждый подпуть, как если бы он был закрыт вызовом CGContextClosePath». - Поэтому закрытие пути не должно быть необходимым. –

+0

Итак, заполнение необходимо в любом случае –

+0

Вы должны использовать 'CGContextDrawPath (..., kCGPathFillStroke)', если вы хотите заполнить * и * погладить путь (сравните http://stackoverflow.com/a/16462849/1187415) , –

1

Это работает с использованием ППО отправил код:

UIImage *image = [[self class] drawColorTriangleWithBorderWidth:100 Height:100 R:200 G:0 B:0 A:200 BorderR:0 BorderG:0 BorderB:200 BorderA:100 Thickness:3.0]; 

[UIImageJPEGRepresentation(image, 1.0) writeToFile:@"/Users/dan/Desktop/UIImage.jpg" atomically:YES]; 

, производящего это изображение:
enter image description here

+0

В документации 'CGContextFillPath()' явно указано: «Кварц рассматривает каждый подпуть, как если бы он был закрыт вызовом CGContextClosePath». - Поэтому закрытие пути не должно быть необходимым. –

+1

@Martin Но если я рисую две стороны треугольника и инсульта, я тоже получаю третий поглаженный? Мое чтение состоит в том, что 'CGContextClosePath' не требуется для заполнения, неповрежденная эта цитата только в документации для процедур заполнения. Означает ли это, что третья сторона треугольника не требуется добавлять для заполнения? – zaph

+0

Прежде всего, вам нужно использовать 'CGContextDrawPath (context, kCGPathFillStroke)', если вы хотите заполнить * и * погладить путь (сравните http://stackoverflow.com/a/16462849/1187415). Вы правы, что закрытие пути необходимо для полного поглаживания. Но сообщаемая проблема в вопросе заключается в том, что * «заполняется вся область вокруг треугольника» *. Возможно, 'kCGPathFillStroke' не закрывает путь неявно, в отличие от' CGContextFillPath() '... –

Смежные вопросы