Подтвердить что ты не робот

Рисование 1-пиксельной ширины в iOS

Я рисую путь в моей реализации drawRect на UIView с помощью:

CGContextSetLineWidth(context, 0.5);
CGContextStrokePath(context);

С помощью сглаживания на моем CGContext я не могу рисовать 1 пиксель строк.

on

Я попытался отключить сглаживание:

CGContextSetShouldAntialias(context, NO);

но тогда мои углы выглядят ужасно:

off

Как сохранить сглаживание, но остановите это субпиксельное размытие 1 пиксельной строки?

4b9b3361

Ответ 1

Когда вы рисуете строку в iOS, вы указываете координаты бесконечно узкой линии. Затем нарисованная линия будет простираться на обе стороны этой линии на половину ширины хода.

Если ваша бесконечно узкая линия имеет целые координаты и горизонтальна или вертикальна, нарисованная линия будет шириной в два пикселя и серой, а не шириной в один пиксель и черной (с сглаживанием). Без сглаживания линия будет слегка перемещена, но углы выглядят уродливо.

Чтобы решить эту проблему, используйте координаты в середине пикселя (например, 200,5/170,5) и включите сглаживание.

Ответ 2

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    CGFloat inset = 0.5 / [[UIScreen mainScreen] scale];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    // draw
    CGContextSetLineWidth(context, inset);
    CGContextSetStrokeColorWithColor(context, _lineColor.CGColor);
    CGContextMoveToPoint(context, inset, 0);
    CGContextAddLineToPoint(context, inset, CGRectGetHeight(rect));
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
}

Ответ 3

Вы можете перевести весь контекст с помощью:

CGContextSaveGState(context);
CGFloat translation = 0.5f / [[UIScreen mainScreen] scale];
CGContextTranslateCTM(context, translation, translation);
... your drawing here ...
CGContextRestoreGState(context);

Что все!

Ответ 4

Единственное решение, которое сработало для меня, было следующим:

override func drawRect(rect: CGRect) {

    let context = UIGraphicsGetCurrentContext()

    CGContextSetLineWidth(context, 0.5)

    CGContextMoveToPoint(context, 0.0, 0.25)
    CGContextAddLineToPoint(context, rect.size.width, 0.25)

    CGContextSetStrokeColorWithColor(context, UIColor.blackColor().CGColor)
    CGContextStrokePath(context)
}