2010-09-28 21 views
12

Bất cứ ai cũng có ý tưởng tại sao CGContextFillPath sẽ không hoạt động trong đoạn mã dưới đây? Tôi đang sử dụng đoạn mã sau để vẽ lên UIImageView. Nó vuốt ve đường dẫn chính xác, nhưng bỏ qua CGContextFillPath.Bản vẽ dòng CGContext: CGContextFillPath không hoạt động?

UIGraphicsBeginImageContext(self.frame.size); 
[drawingView.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0); 
CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
CGContextSetRGBFillColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), firstMovedTouch.x, firstMovedTouch.y); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
CGContextFillPath(UIGraphicsGetCurrentContext()); 
drawingView.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Trả lời

5

Tôi nghĩ bạn cần gọi CGContextClosePath trước khi bạn có thể điền vào đường dẫn. Tôi không chắc chắn những gì bạn đang cố gắng để vẽ, nhưng CGContextFillPath sẽ điền vào các khu vực bên trong đường dẫn và tôi chỉ nhìn thấy dòng duy nhất ở đây.

+0

Ồ ... bạn nói đúng. Tôi đang sử dụng mã cho bản vẽ đường kẻ ghetto. Nhưng điều đó có ý nghĩa. Mã này được kích hoạt trên touchesMoved: và hoạt động tốt cho các bản vẽ đường, nhưng tôi sẽ phải lưu tất cả các điểm vào một mảng hoặc một thứ gì đó, để lấp đầy đường dẫn khi người dùng nhấc ngón tay lên. – RyJ

9

Tôi gặp sự cố tương tự. Tôi thấy rằng bạn không thể sử dụng

CGContextStrokePath(UIGraphicsGetCurrentContext()) 
CGContextFillPath(UIGraphicsGetCurrentContext()) 

liên tiếp: sau này sẽ không hoạt động vì sau khi thực hiện hành trình trên đường, đường dẫn sẽ bị xóa khỏi ngữ cảnh.

Vì vậy, tôi đã sử dụng cùng một đường dẫn hai lần; một cho đột quỵ , khác cho điền.

// ... create a path of CGMutablePathRef .... 

CGContextSaveGState(context); 
//....fill the path ..... 
CGContextRestoreGState(context); 

CGContextSaveGState (context); 
//....stroke the path ..... 
CGContextRestoreGState(context); 

CFRelease(path); 
+0

Cảm ơn. Điều đó đã cứu tôi sau khi tuổi của vấn đề chụp – Designer023

+0

Đó là trong tài liệu: Khi bạn muốn nối thêm đường dẫn đến ngữ cảnh đồ họa, bạn gọi hàm CGContextAddPath. Con đường ở lại trong bối cảnh đồ họa cho đến khi Quartz sơn nó. Bạn có thể thêm lại đường dẫn bằng cách gọi CGContextAddPath. –

26

Để giải quyết vấn đề này, sử dụng đoạn mã sau:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0); 
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
CGContextSetLineJoin(context, kCGLineJoinRound); 
CGContextSetLineWidth(context, 8.0); 

CGMutablePathRef pathRef = CGPathCreateMutable(); 

/* do something with pathRef. For example:*/ 
CGPathMoveToPoint(pathRef, NULL, x, y); 
CGPathAddLineToPoint(pathRef, NULL, x, y+100); 
CGPathAddLineToPoint(pathRef, NULL, x+100, y+100); 
CGPathAddLineToPoint(pathRef, NULL, x+100, y); 
CGPathCloseSubpath(pathRef); 

CGContextAddPath(context, pathRef); 
CGContextFillPath(context); 

CGContextAddPath(context, pathRef); 
CGContextStrokePath(context); 

CGPathRelease(pathRef); 
+0

Điều này giúp tôi, cảm ơn! – Christopher

+0

Brilliant !!!!! –

18

Tôi tin rằng cách tốt nhất để đột quỵ và điền đường dẫn của bạn là thêm dòng mã sau đây sau khi bạn đã thiết lập xong lên đường dẫn của bạn:

CGContextDrawPath(myContext, kCGPathFillStroke); 
+1

Tuyệt vời !!!!!!!! –

+1

Genius !!!!!!!!! –

+0

Nó chỉ đơn giản là một vấn đề xem khóa học Stanford CS193P trở lại trong ngày ... Tôi nghĩ rằng đó là bài giảng thứ hai, hoặc thứ ba họ giới thiệu này. – Mazyod

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