2013-01-10 16 views
5

Con la grafica di base, è possibile accarezzare l'interno di un percorso? A differenza del peso della linea che viene disegnato a metà all'esterno e metà all'interno di un percorso a tratti?drawRect UIView: è possibile tracciare all'interno di un percorso?

La ragione è che sarebbe più facile controllare lo spessore visibile del tratto se si dice che parte di una vista si trova sul bordo dello schermo e che la parte non lo è. La parte sul bordo dello schermo viene tagliata, mentre il bordo della vista che è completamente sullo schermo appare più spesso (come entrambi i lati se il tratto è visibile).

enter image description here

risposta

10

clip per il percorso prima di accarezzarlo.

+0

Grazie! Potresti guardare la mia "risposta" qui sopra e commentare. Questo metodo non funziona. Il tratto non disegna affatto. Cos'è la clip in traccia, il nome del metodo? – Mrwolfy

+0

Sei vicino. [La documentazione di 'CGContextClip()'] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextClip) dice : "Dopo aver determinato il nuovo tracciato di ritaglio, la funzione reimposta il percorso corrente del contesto su un percorso vuoto." Questo spiega perché 'CGContextDraw' non disegna nulla - è necessario aggiungere nuovamente il percorso al contesto, prima di accarezzarlo. –

+0

Utilizzo di ['CGPath'] (https://developer.apple.com/library/ios/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html#//apple_ref/c/tdef/CGPathRef) o [ 'UIBezierPath'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html) renderebbe il processo più semplice - potresti creare il percorso una volta, quindi usare due volte. –

6

Questo pareggi nessun colpo:

- (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: Questo è ciò che ha funzionato (a seconda della risposta corretta):

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

} 
Problemi correlati