2013-05-09 36 views
7

Tôi đang gặp sự cố khi vẽ một số đường kẻ được vuốt bằng một màu và sau đó điền vào bên trong chúng (chúng tạo một đa giác) với một hình khác.Vẽ một đa giác với một màu cho đột quỵ và một màu khác để điền?

UIColor *houseBorderColor = [UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1]; 
CGContextSetStrokeColorWithColor(context, houseBorderColor.CGColor); 
CGContextSetLineWidth(context, 3); 

// Draw the polygon 
CGContextMoveToPoint(context, 20, viewHeight-19.5); 
CGContextAddLineToPoint(context, 200, viewHeight-19.5); // base 
CGContextAddLineToPoint(context, 300, viewHeight-119.5); // right border 
CGContextAddLineToPoint(context, 120, viewHeight-119.5); 
CGContextAddLineToPoint(context, 20, viewHeight-19.5); 

// Fill it 
CGContextSetRGBFillColor(context, (248/255.0), (222/255.0), (173/255.0), 1); 
//CGContextFillPath(context); 

// Stroke it 
CGContextStrokePath(context); 

Với CGContextStrokePath nhận xét ra, tôi nhận được kết quả này:

enter image description here

Nhưng nếu tôi bỏ ghi chú CGContextStrokePath và điền thông tin vào đa giác, màu sắc tràn đột quỵ:

enter image description here

Làm cách nào để bạn đạt được kết quả như thế này (mà không cần phải làm lại thủ tục vẽ ole hai lần):

enter image description here

Trả lời

16

Bạn có thể sử dụng

CGContextDrawPath(context, kCGPathFillStroke); 

thay vì

CGContextFillPath(context); 
CGContextStrokePath(context); 

Vấn đề là cả hai CGContextFillPath()CGContextStrokePath(context) rõ ràng con đường hiện nay, để chỉ những hoạt động đầu tiên thành công, và hoạt động thứ hai không có gì. CGContextDrawPath() kết hợp điền và đột quỵ mà không cần xóa đường dẫn ở giữa.

+0

Tôi không muốn âm thanh đòi hỏi, nhưng bạn có thể có thể xây dựng để làm cho một câu trả lời hoàn chỉnh, bởi vì tôi không hoàn toàn nhận được nơi nên 'CGContextDrawPath()' nên đi? –

+3

Xin lỗi, câu trả lời quá ngắn vì tôi đang trên điện thoại :-) Cuộc gọi đó thay thế cả CGContextFillPath và ... StrokePath. –

+0

Đây là giải pháp tốt nhất trong trường hợp này. – alastair

2

Khi bạn đột quỵ hoặc điền vào đường dẫn trong bối cảnh, bối cảnh loại bỏ con đường cho bạn (nó hy vọng rằng đó là công việc được thực hiện). Bạn phải thêm lại đường dẫn nếu bạn muốn điền nó sau khi vuốt nó.

Có lẽ cách tốt nhất là tạo một biến địa phương CGPathRef path, tạo đường dẫn, thêm, đột quỵ, thêm lại, điền.

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, nil, 20, viewHeight-19.5); 
CGPathAddLineToPoint(path nil, 200, viewHeight-19.5); // base 
CGPathAddLineToPoint(path nil, 300, viewHeight-119.5); // right border 
CGPathAddLineToPoint(path nil, 120, viewHeight-119.5); 
CGPathAddLineToPoint(path nil, 20, viewHeight-19.5); 

CGContextAddPath(context, path); 
CGContextFillPath(context); 

// possibly modify the path here if you need to 

CGContextAddPath(context, path); 
CGContextStrokePath(context); 
+0

có thể xây dựng trên 'tạo path' sử dụng mã tôi cung cấp? –

+1

Bạn sẽ sử dụng [CGPath API] (https://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html) thay vì [CGContext] (https: // developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGContext/Reference/reference.html) để tạo đường dẫn. Tuy nhiên, trong trường hợp này, bạn có lẽ nên sử dụng 'CGContextDrawPath()', vì vấn đề bạn đang gặp phải thực sự là đường dẫn được xóa khỏi ngữ cảnh bằng 'CGContextFillPath()' (và vì vậy bạn đang vuốt ve một đường dẫn trống, đó là lý do tại sao không có gì xảy ra). – alastair

+0

Tôi thực sự đánh giá cao bạn dành thời gian để giải thích khái niệm này, điều này làm cho mọi thứ rõ ràng hơn nhiều liên quan đến CGContext! Cảm ơn! –

5

Sử dụng UIBezierPath bạn có thể làm điều này:

UIBezierPath *path = [[UIBezierPath alloc] init]; 
[path moveToPoint:CGPointMake(20, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(200, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(300, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(120, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(20, viewHeight-19.5)]; 

[[UIColor colorWithRed:(248/255.0) green:(222/255.0) blue:(173/255.0) alpha:1.0] setFill]; 
[path fill]; 
[[UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1.0] setStroke]; 
[path stroke]; 
+0

Tôi biết về UIBezierPath chỉ từ các ví dụ của Apple, nó có bất kỳ lợi ích nào trái ngược với phương thức 'CGContext' được trả về trong câu hỏi của tôi không? @MikePollard –

+2

Tôi nghĩ rằng tất cả những lợi thế thông thường của việc sử dụng NSObjects chứ không phải là các đối tượng nền tảng lõi. –

Các vấn đề liên quan