Графика iPhone Core более толстая пунктирная линия для подпредставления - PullRequest
8 голосов
/ 20 ноября 2010

У меня есть UIView, и внутри него я нарисовал линию, используя Core Graphics, переопределив drawRect.Это представление также содержит одно подпредставление, которое также рисует линию.Однако, хотя оба представления используют практически одинаковый код (по крайней мере, для целей тестирования), нарисованные на них линии не выглядят одинаково:

Image problem

Как вы можете видеть- пунктирная линия сверху заметно толще нижней, и я понятия не имею, почему.Ниже приведен код, используемый двумя UIViews в их drawRect методах.Если у вас есть идея, почему это происходит, тогда я буду признателен за вашу помощь и совет!

Первый вид:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]);

CGFloat dashes[] = {1,1};

CGContextSetLineDash(context, 0.0, dashes, 2);
CGContextSetLineWidth(context, 0.6);

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect));
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect));

CGContextStrokePath(context);

SubUIView *view = [[SubUIView alloc] initWithFrame:rect];
[self addSubview:view];
[view release];

Вид определенно создается только один раз.Я ценю, что drawRect может быть не лучшим местом для добавления подпредставления, но проблема остается даже при добавлении его в основной метод initWithFrame.

Второе представление:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]);

CGFloat dashes[] = {1,1};

CGContextSetLineDash(context, 0.0, dashes, 2);
CGContextSetLineWidth(context, 0.6);

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMidY(rect));
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMidY(rect));

CGContextStrokePath(context);

Ответы [ 2 ]

6 голосов
/ 20 ноября 2010

Это может быть результатом сглаживания, если ваш прямоугольник не падает на целые числа.Вы можете отключить сглаживание с помощью CGContextSetShouldAntialias( context, NO ).Я думаю, что есть также функция для создания прямоугольного интеграла, но я не могу вспомнить, что это такое.

0 голосов
/ 20 ноября 2010

Во-первых, вы должны решить проблему кода WET *.Вы говорите, что делаете это «для целей тестирования», но на самом деле это усложняет тестирование, поскольку вам нужно изменить оба фрагмента кода и / или указать, над какой версией вы работаете.В худшем случае вы изменяете оба фрагмента кода по-разному и должны объединить их вручную.

Я бы сказал, переместите код из пунктирной линии в подпредставление, добавьте свойства для чего-либо, что два фрагментакод должен работать по-другому и создавать два подпредставления (а не в drawRect: - серьезно).

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

Кстати, rect не обязательно является границей вашего изображения.Никогда не думайте, что это так, иначе вы получите интересный рисунок, если это не так.Предположим, что это некоторый раздел границ - возможно, но, возможно, нет, всего этого.Когда вы имеете в виду [self bounds], скажем [self bounds].

Скорее всего, проблема заключается в разнице между CGRectGetMidY([self bounds]) и CGRectGetMaxY([self bounds]).Один включает дробь, которая разделяет пиксель, а другой кратен одному пикселю или близок к нему.(Не обязательно кратно 1 - на Retina Display, 1 pt = 2 пикселя, поэтому 1 pixel = 0,5 pt.) Попробуйте наложить оба числа и при желании добавить 0,5, и посмотрите, какой вам больше нравится.

Нет никакого способа заставить это работать идеально с шириной линии 0,6 пункта.Там просто нет целого числа пикселей, которое работает.Все, что вы можете сделать, это решить, что выглядит лучше всего, и сделать это.

* Написано в других местах, в противоположность DRY.

...