Странное сглаживание в пользовательском представлении - PullRequest
5 голосов
/ 21 сентября 2009

У меня есть пользовательский UIView, который рисуется с использованием метода -[drawRect:].

Проблема в том, что сглаживание действует очень странно, поскольку черные линии горизонтальные или вертикальные линии нарисованы очень размытыми.

Если я отключаю сглаживание с помощью CGContextSetAllowsAntialiasing, все отрисовывается как положено.

Anti-Aliasing:
альтернативный текст http://dustlab.com/stuff/antialias.png

Без сглаживания (что похоже на ожидаемый результат с АА):
альтернативный текст http://dustlab.com/stuff/no_antialias.png

Ширина линии ровно 1, а все координаты являются целыми значениями.

То же самое происходит, если я рисую прямоугольник, используя CGContextStrokeRect, но не если я рисую точно такой же CGRect с UIRectStroke.

Ответы [ 2 ]

10 голосов
/ 21 сентября 2009

Поскольку обводка расширяется равными величинами в обе стороны, строка шириной в один пиксель не должна быть размещена на целочисленной координате, но со смещением 0,5 пикселя.

Рассчитать правильные координаты для штриховых линий следующим образом:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f);

Кстати: не приводите ваши значения к int и обратно к float, чтобы избавиться от десятичной части. Для этого в Си есть функция под названием floor.

0 голосов
/ 21 сентября 2009

в ваших фреймах вида у вас, вероятно, есть значения с плавающей точкой, которые не являются целыми числами. В то время как кадры достаточно точны, чтобы делать доли пикселя (float), вы получите размытость, если вы не приведете к int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...