Скругленный прямоугольник NSBezierPath имеет плохие углы

#cocoa #stroke #nsbezierpath

#cocoa #обводка #nsbezierpath

Вопрос:

У меня есть 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];
  

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

углы

Кто-нибудь знает, что является причиной этого? Я просто что-то упускаю?

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

Ответ №1:

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

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

 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 когда-либо он выглядит немного странно или размыто, попробуйте сдвинуть его на половину пикселя.

Комментарии:

1. Вместо того, чтобы сдвигать его на половину пикселя, обычно лучше вставить рисунок на половину ширины обводки контура, что на самом деле и делает ваш код здесь.

2. Более короткий способ: NSInsetRect(self.bounds, 0.5, 0.5)

Ответ №2:

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