2013-01-10 7 views
5

Mit Core-Grafiken, ist es möglich, das Innere eines Pfades zu streichen? Im Gegensatz zum Liniengewicht, das halb außen und halb im Inneren eines gestrichenen Weges gezeichnet wird?UIView drawRect: ist es möglich innerhalb eines Pfades zu streichen?

Der Grund dafür wäre, dass es einfacher wäre, die sichtbare Dicke des Strichs zu kontrollieren, wenn ein Teil einer Ansicht auf der Bildschirmkante liegt und ein Teil nicht. Der Teil auf der Bildschirmkante wird abgeschnitten, während die Ansichtskante, die vollständig auf dem Bildschirm ist, dicker aussieht (beide Seiten, wenn der Strich sichtbar ist).

enter image description here

Antwort

10

Clip auf den Weg, bevor Sie streicheln.

+0

Dank! Könnten Sie sich meine "Antwort" oben ansehen und kommentieren? Diese Methode funktioniert nicht ganz. Der Strich zeichnet überhaupt nicht. Was ist Clip zu Pfad, der Methodenname? – Mrwolfy

+0

Sie sind in der Nähe. [Die Dokumentation zu 'CGContextClip()'] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CGContext/Reference/reference.html#/apple_ref/c/func/CGContextClip) sagt : "Nach dem Festlegen des neuen Beschneidungspfads setzt die Funktion den aktuellen Pfad des Kontexts auf einen leeren Pfad zurück." Das erklärt, warum 'CGContextDraw' nichts zeichnet - Sie müssen den Pfad zum Kontext erneut hinzufügen, bevor Sie streichen. –

+0

Verwenden von ['CGPath'] (https://developer.apple.com/library/ios/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html#//apple_ref/c/tdef/CGPathRef) oder [ 'UIBezierPath'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html) würde diesen Prozess vereinfachen - Sie könnten den Pfad einmal erstellen und dann verwenden es zweimal. –

6

Dies zieht keinen Schlaganfall:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect), CGRectGetHeight(rect)); 
    CGFloat radius = 30; 
    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect); 
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
    CGContextClip(context); 
    CGContextDrawPath(context, kCGPathStroke); 
} 

EDIT: Dies ist, was (nach der richtigen Antwort) gearbeitet:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect pathRect = CGRectMake(10, 10, rect.size.width -20, rect.size.height -20); 
    CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:pathRect cornerRadius:20].CGPath; 
    CGContextAddPath(context, path); 
    CGContextClip(context); 
    CGContextAddPath(context, path); 
    CGContextDrawPath(context, kCGPathEOFillStroke); 

}