2012-11-23 15 views
13

Aşağıdaki kod CGRect (rectRect) tarafından tanımlanan yuvarlak bir dikdörtgen oluşturur.Doldurulduktan sonra yolu inme yapamıyor

İyi doldurur, ancak inme yapmıyorum. Felç göremediğim hakkında bir fikrin var mı?

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

} 

cevap

44

Bir yol boya ya okşayarak ya da doldurarak, grafik içerik boşaltmak giden yolunu sıfırlar. Dolayısıyla, CGContextFillPath numaralı telefonu aradıktan sonra, bağlamın kontur yolu yoktur.

CGContextDrawPath(ctx, kCGPathFillStroke); 

kCGPathFillStroke sabit onu felç ardından yolu doldurup etmek Çekirdek Grafik söyler: Bunun yerine yolunu doldurmak için ve daha sonra inme o, bir arama hem yapmak CGContextDrawPath işlevini kullanabilirsiniz çalışmakla

.

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

Teşekkür:

Öte yandan

, sen ölçüde kod miktarını azaltmak için UIBezierPath ve UIColor kullanabilirsiniz. Aradığım şey bu. – Mrwolfy

+0

Bu arada, UIBezierPath seçeneği yüksek performans düzeltmesi mi? Elbette kusursuz çalışıyor. Ya da başka bir yere bakmalıyım. – Mrwolfy

+0

Enstrümanlar, darboğazların nerede olduğunu söyleyene kadar performanstan endişe etmeyin. –

İlgili konular