NSBezierPath скругленный прямоугольник имеет плохие углы - PullRequest
9 голосов
/ 20 апреля 2011

У меня есть NSBezierPath, который делает скругленный прямоугольник, но его углы выглядят прерывистыми и выглядят ярче, чем остальная часть мазка при просмотре в полном масштабе. Мой код:

 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];

Вот изображение 2 углов (на маленькой картинке это не так очевидно):

corners

Кто-нибудь знает, что вызывает это? Я просто что-то упустил?

Спасибо за любую помощь

Ответы [ 2 ]

19 голосов
/ 20 апреля 2011

Прямые линии скругления находятся точно на границах вида, поэтому половина ширины каждой линии обрезается. (Как будто они были на субпикселе.)

Попробуйте изменить

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

до

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

Если NSBezierPath выглядит немного странно или размыто, попробуйте сместить его на половину пикселя.

0 голосов
/ 20 апреля 2011

Взгляните на метод setFlatness: в NSBezierPath документах.Он контролирует, насколько сглаженные кривые отображаются.Я полагаю, что установив его на меньшее число (по умолчанию 0,6), получим более плавные кривые, затрачивая больше вычислений (хотя для простых путей, я сомневаюсь, что это очень важно).

...