Рисование очень тонкой линии с помощью CGContextAddLineToPoint и CGContextSetLineWidth
Я хочу нарисовать очень тонкую ширину линии волос в моем методе drawVect UIView. Линия, которую я вижу, имеет значение 0.5 для CGContextSetLineWidth, не совпадает с тем же значением ширины 1.0, которое используется для рисования CALayer границы.
Вы можете видеть разницу между двумя - красная линия (ширина = 1) намного тоньше, чем пурпурно-синяя линия (ширина = 0,5).
![Border drawn with CALayer]()
Вот как я рисую мою горизонтальную линию ширины псевдо 1,0:
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextSetLineWidth(ctx, 0.5); // I expected a very thin line
CGContextMoveToPoint(ctx, 0, y);
CGContextAddLineToPoint(ctx, self.bounds.size.width, y);
CGContextStrokePath(ctx);
Здесь граница для того же вида, на этот раз с использованием ширины рамки 1.0:
UIView *myView = (UIView *)self;
CALayer *layer = myView.layer;
layer.borderColor = [UIColor redColor].CGColor;
layer.borderWidth = 1.0;
Что мне нужно сделать по-другому, чтобы нарисовать мою собственную пользовательскую строку той же ширины, что и версия CALayer?
Ответы
Ответ 1
Когда вы поглаживаете путь, штрих останавливает путь. Чтобы сказать это по-другому, путь лежит вдоль центра удара.
Если путь проходит по краю между двумя пикселями, то штрих (частично) будет охватывать пиксели по обеим сторонам этого края. При ширине линии 0,5 горизонтальный ход будет увеличиваться на 0,25 точки в пикселе над дорожкой и на 0,25 точки в пикселе ниже пути.
Вам нужно переместить свой путь, чтобы он не работал по краю пикселей:
CGFloat lineWidth = 0.5f;
CGContextSetLineWidth(ctx, lineWidth);
// Move the path down by half of the line width so it doesn't straddle pixels.
CGContextMoveToPoint(ctx, 0, y + lineWidth * 0.5f);
CGContextAddLineToPoint(ctx, self.bounds.size.width, y + lineWidth * 0.5f);
Но поскольку вы просто рисуете горизонтальную линию, проще использовать CGContextFillRect
:
CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextFillRect(ctx, CGRectMake(0, y, self.bounds.size.width, 0.5f));
Ответ 2
Вам нужно отключить сглаживание, чтобы получить тонкую линию, если она не нарисована на интеграле.
CGContextSetShouldAntialias(ctx, NO)