Search code examples
cocoastrokensbezierpath

NSBezierPath rounded rectangle has bad corners


I have an NSBezierPath that makes a rounded rectangle but the corners of it look choppy and appear brighter that the rest of the stroke when viewed at full scale. My code is:

 NSBezierPath *path = [NSBezierPath bezierPath];
    [path appendBezierPathWithRoundedRect:NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height) xRadius:5 yRadius:5];

    NSGradient *fill = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithCalibratedRed:0.247 green:0.251 blue:0.267 alpha:0.6],0.0,[NSColor colorWithCalibratedRed:0.227 green:0.227 blue:0.239 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.180 green:0.188 blue:0.196 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.137 green:0.137 blue:0.157 alpha:0.6],1.0, nil];
    [fill drawInBezierPath:path angle:-90.0];

    [[NSColor lightGrayColor] set];
    [path stroke];

Heres a picture of 2 of the corners (Its not as obvious in a small picture):

corners

Anyone know what's causing this? Am I just missing something?

Thanks for any help


Solution

  • The straight lines of the roundrect are exactly on the borders of the view, so half the width of each line is getting cut off. (As if they were on a subpixel.)

    Try changing

    NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height)
    

    to

    NSMakeRect(0.5, 0.5, [self bounds].size.width - 1, [self bounds].size.height - 1)
    

    If an NSBezierPath ever looks a bit weird or blurry, try shifting it over half a pixel.