Как избежать смешения цветов при рисовании прямоугольников? - PullRequest
3 голосов
/ 31 января 2012

При рисовании прямоугольников в UIView для ios у меня остается одна и та же проблема: поля прямоугольника смешивают свой цвет с фоном. Я попробовал несколько методов рисования прямоугольника с одинаковыми результатами - используя путь Безье, рисование построчно, рисование полей и заполнение внутренней части прямоугольника.

Сами кадры вида всегда правильно рисуются. Я даже рассматривал возможность использования представлений всякий раз, когда мне нужен прямоугольник, но это не похоже на правильный способ делать вещи специально, потому что мне нужно рисовать многие из них.

Вот пример моей проблемы. Для сравнения я рисую прямоугольный зеленый вид с такими же размерами:

CGRect horizontalBar = CGRectMake(2, 2, 10, 6);

UIView* horizontalBarSubView = [[UIView alloc] initWithFrame:horizontalBar];
horizontalBarSubView.backgroundColor = [UIColor greenColor];
[self addSubview:horizontalBarSubView];
[horizontalBarSubView release];

А для самого прямоугольника:

CGRect horizontalBar = CGRectMake(2, 20, 10, 6);

UIBezierPath* horizontalBarPath = [UIBezierPath bezierPathWithRect:horizontalBar];
[[UIColor greenColor] set];
[horizontalBarPath fill];

Это дает следующий результат (10-кратное увеличение):

10x zoom rectangle test

Что вызывает смешение цветов?

Как мне избежать этого?

Ответы [ 2 ]

2 голосов
/ 31 января 2012

@ Almo правильно, что ваша проблема сглаживания, но вы уверены, что это фактический код и значения?Это не должно быть псевдонимом, и мои тесты показывают, что это не так.Чтобы получить ваш результат, я должен изменить ваш путь на это:

CGRect horizontalBar = CGRectMake(2.5, 20.5, 10, 6);

Заполнение пути на дробном пикселе даст вам эффект, который вы видите.Кроме того, обводка пути на целых пикселях с нечетной шириной будет сглаживать этот путь.(Все на дисплее не Retina; Retina немного отличается.)

Обычно я не рекомендую отключать сглаживание, как рекомендует @Almo.Вместо этого вам просто нужно убедиться, что ваши пути прорисованы или заполнены целыми пикселями.

Это более подробно описано в главе 6 из Программирование на iOS 5 «Раздвигая границы» , стр. 114.

2 голосов
/ 31 января 2012

Вы пробовали возиться с CGContext?

CGContextSetShouldAntialias

Посмотрите на настройки контекста графики здесь:

http://www.apeth.com/iOSBook/ch15.html

"Когда вы рисуете вграфический контекст, чертеж подчиняется текущим настройкам контекста. Таким образом, процедура всегда состоит в том, чтобы сначала настроить параметры контекста, а затем нарисовать. "

Вы хотите, чтобы контекст не устанавливал флаг CGContextSetShouldAntialias.

Хотя, как указано в комментариях, это заполнит пиксели, которые в противном случае были бы смешаны с цветом прямоугольника.

...