Рисование 1-пиксельной ширины в iOS
Я рисую путь в моей реализации drawRect на UIView с помощью:
CGContextSetLineWidth(context, 0.5);
CGContextStrokePath(context);
С помощью сглаживания на моем CGContext я не могу рисовать 1 пиксель строк.
![on]()
Я попытался отключить сглаживание:
CGContextSetShouldAntialias(context, NO);
но тогда мои углы выглядят ужасно:
![off]()
Как сохранить сглаживание, но остановите это субпиксельное размытие 1 пиксельной строки?
Ответы
Ответ 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)
}