2010-09-28 3 views
12

У кого-нибудь есть идея, почему CGContextFillPath не будет работать в фрагменте кода ниже? Я использую следующий код для рисования в UIImageView. Он правильно гладит путь, но игнорирует CGContextFillPath.Линия CGContext: CGContextFillPath не работает?

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(); 

ответ

5

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

+0

О, вы правы. Я использую код для рисования линии гетто. Но это имеет смысл. Этот код запускается прикосновенияМодуль: и отлично работает для линейных чертежей, но мне нужно будет сохранить все точки в массиве или что-то еще, чтобы заполнить путь после того, как пользователь поднимет свой палец. – RyJ

9

У меня была такая же проблема. Я обнаружил, что вы не можете использовать

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

последовательно: последний не будет работать, потому что после совершения удара по пути, путь удаляется из контекста.

Итак, я использовал один и тот же путь дважды; один для инсульта, другой для заполнения.

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

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

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

CFRelease(path); 
+0

Спасибо. Это спасло меня после старения проблемной съемки. – Designer023

+0

Это в документах: если вы хотите добавить путь к графическому контексту, вы вызываете функцию CGContextAddPath. Путь остается в графическом контексте до тех пор, пока Кварц не окрасит его. Вы снова можете добавить путь, вызвав CGContextAddPath. –

26

Чтобы решить эту проблему, используйте следующий код:

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

Это поможет мне, спасибо! – Christopher

+0

Блестящий !!!!! –

18

Я считаю, что самый лучший способ, чтобы погладить и заполнить свой путь, чтобы добавить следующую строку кода после того, как вы закончили настройку по вашему пути:

CGContextDrawPath(myContext, kCGPathFillStroke); 
+1

Удивительный !!!!!!!! –

+1

Гений !!!!!!!!! –

+0

Это просто вопрос просмотра курса Стэнфорда CS193P в тот день ... Я думаю, что это была вторая или третья лекция, которую они представили. – Mazyod