2012-11-23 9 views
13

Il codice sottostante crea graziosamente un rettangolo arrotondato definito da CGRect (rectRect).Impossibile tracciare il percorso dopo averlo riempito

Si riempie bene, ma non mi viene un ictus. Qualche idea per cui non riesco a vedere l'ictus?

-(void)drawRect:(CGRect)rect { 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGContextSetRGBFillColor(ctx, 0, 0, 0, 0.4); 
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1); 
    CGContextSetLineWidth(ctx, 4.0); 

    float fw, fh; 
    rect = rectRect; 
    float ovalWidth = 12; 
    float ovalHeight = 12; 

    if (ovalWidth == 0 || ovalHeight == 0) { 
     CGContextAddRect(ctx, rect); 
     return; 
    } 

    CGContextTranslateCTM (ctx, CGRectGetMinX(rect), CGRectGetMinY(rect)); 
    CGContextScaleCTM (ctx, ovalWidth, ovalHeight); 
    fw = CGRectGetWidth (rect)/ovalWidth; 
    fh = CGRectGetHeight (rect)/ovalHeight; 
    CGContextMoveToPoint(ctx, fw, fh/2); 
    CGContextAddArcToPoint(ctx, fw, fh, fw/2, fh, 1); 
    CGContextAddArcToPoint(ctx, 0, fh, 0, fh/2, 1); 
    CGContextAddArcToPoint(ctx, 0, 0, fw/2, 0, 1); 
    CGContextAddArcToPoint(ctx, fw, 0, fw, fh/2, 1); 
    CGContextClosePath(ctx); 

    CGContextFillPath(ctx); 
    CGContextStrokePath(ctx); 

} 

risposta

44

Quando si dipinge un tracciato, accedendolo o riempiendolo, il contesto grafico reimposta il percorso verso il vuoto. Quindi, dopo aver chiamato CGContextFillPath, il contesto non ha un percorso da tracciare.

Invece di cercare di riempire il percorso e poi accarezzarlo, è possibile utilizzare la funzione CGContextDrawPath a fare entrambe le cose in una sola chiamata:

CGContextDrawPath(ctx, kCGPathFillStroke); 

La costante kCGPathFillStroke dice Graphics Core per riempire il percorso e poi accarezzarlo .

D'altra parte, è possibile utilizzare UIBezierPath e UIColor per ridurre la quantità di codice sostanzialmente:

-(void)drawRect:(CGRect)rect { 
    [[UIColor colorWithWhite:0 alpha:0.4] setFill]; 
    [[UIColor whiteColor] setStroke]; 

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectRect cornerRadius:12]; 
    path.lineWidth = 4; 
    [path fill]; 
    [path stroke]; 
} 
+1

Grazie. Questo è quello che stavo cercando. – Mrwolfy

+0

Oh, a proposito, l'opzione UIBezierPath è la correzione ad alte prestazioni? Funziona perfettamente, naturalmente. O dovrei cercare altrove. – Mrwolfy

+0

Non preoccuparti delle prestazioni fino a quando Strumenti ti dirà dove sono i colli di bottiglia. –

Problemi correlati