#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) приведет к более плавным кривым ценой дополнительных вычислений (хотя для простых путей я сомневаюсь, что это имеет большое значение).