2012-11-23 32 views
13

Đoạn mã dưới đây tạo ra hình chữ nhật tròn được xác định bởi một CGRect (rectRect).Đường nét không thể đột quỵ sau khi điền vào

Nó lấp đầy, nhưng tôi không bị đột quỵ. Bất kỳ ý tưởng tại sao tôi không thể nhìn thấy đột quỵ?

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

} 

Trả lời

44

Khi bạn vẽ một đường dẫn, bằng cách vuốt ve hoặc điền vào, ngữ cảnh đồ họa sẽ đặt lại đường dẫn thành trống. Vì vậy, sau khi bạn gọi CGContextFillPath, ngữ cảnh không có đường dẫn đến đột quỵ.

Thay vì cố gắng để lấp đầy con đường và sau đó đột quỵ nó, bạn có thể sử dụng CGContextDrawPath chức năng để thực hiện cả hai trong một cuộc gọi:

CGContextDrawPath(ctx, kCGPathFillStroke); 

Các kCGPathFillStroke liên tục nói với đồ họa lõi để điền đường dẫn và sau đó đột quỵ nó .

Mặt khác, bạn có thể sử dụng UIBezierPathUIColor để giảm số lượng mã đáng kể:

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

Cảm ơn. Đây là những gì tôi đang tìm kiếm. – Mrwolfy

+0

Oh nhân tiện, tùy chọn UIBezierPath có khắc phục hiệu suất cao không? Nó hoạt động hoàn hảo tất nhiên. Hoặc tôi nên tìm ở nơi khác. – Mrwolfy

+0

Đừng lo lắng về hiệu suất cho đến khi Dụng cụ cho bạn biết nơi bị tắc nghẽn. –