2010-11-19 2 views
8

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

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); 
+1

Почему вы добавляете subview в первый вид 'drawRect: '? – jer

+0

@jer: Это обязательно имеет значение? Я могу добавить subview из другого метода, такого как 'initWithFrame', но по-прежнему существует разница в толщине линии. Если я не собираюсь добавлять subviews в представление, которое «рисует» на себе и, следовательно, на проблему (?), Но я еще нигде не читал .... – JoeR

+1

@JoeR, да, это может иметь значение - вы добавляете subviews каждый раз, когда ваш взгляд рисуется, чтобы вы могли закончить несколько идентичных надстроек, расположенных друг над другом, и это может привести к тому, что линии subview выглядят более толстыми, поскольку они были нарисованы несколько раз. – Vladimir

ответ

6

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

+0

Спасибо! Это исправлено! Я полагаю, что ни одна строка не была сплошной белой, как указано в вызове 'CGContextSetStrokeColorWithColor', должно было быть ключом к тому, что происходит некоторое сглаживание. Я действительно удивляюсь * почему * это произошло в subview, а не в главном представлении, но пока я просто буду благодарен, что он работает! – JoeR

+3

Это CGRectIntegral() – nielsbot

-2

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

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

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

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

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

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

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

+0

Спасибо за ваш вклад. Я поменял большой образ при написании вопроса, поскольку маленький, похоже, выполнял эту работу. http://i.imgur.com/KalTm.png - если это поможет. Во всяком случае, я получаю проблему с размером точки, которую я использую, я увеличил ее до 1,0, но даже при этом возникает одна и та же проблема. Отключение сглаживания делает трюк, хотя в соответствии с принятым ответом. – JoeR

Смежные вопросы