drawAtPoint: и drawInRect: размытый текст

При рисовании строк с помощью drawAtPoint:, drawInRect: и даже при установке свойства text UILabels текст иногда может выглядеть слегка размытым.

Я обычно использую Helvetica в большинстве случаев и замечаю, что определенные размеры шрифта вызывают некоторый уровень размытия как в симуляторе, так и на устройстве.

Например:

UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:12];

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

UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:13];

Результат — четкий текст.

Мой вопрос: почему это происходит? И это просто вопрос выбора оптимального размера шрифта для шрифта? Если да, то каковы оптимальные размеры шрифта?

ОБНОВЛЕНИЕ: кажется, что размытость вызвана не размером шрифта. Может случиться так, что центр прямоугольника является дробной точкой. Вот комментарий, который я нашел на форумах разработчиков Apple:

Проверьте положение. Вероятно, это дробный пиксель. Измените центр на целочисленное значение.

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


person Community    schedule 19.03.2009    source источник
comment
См. мой ответ здесь: stackoverflow.com/a/16822238/308315   -  person iwasrobbed    schedule 29.05.2013


Ответы (6)


Я решил это.

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

т.е. NSLog(@"%@", NSStringFromCGRect(theRect)), чтобы определить, какая точка рисуется на дробном пикселе. Затем вызовите round() в этой точке.

person Community    schedule 24.03.2009
comment
ключ к задаче правильный, хотя округление не лучший прием. Многие раунды могут фактически сместить или изменить размер кадра. Лучшим подходом было бы сохранить исходный кадр как свойство, а затем установить его обратно. Это гарантирует отсутствие сдвигов или изменения размеров - person Pavel Gurov; 02.02.2014

Возможно, вы захотите взглянуть на NSIntegralRect(), он делает то, что вы хотите.

person EightyEight    schedule 24.03.2009
comment
NSIntegralRect() предназначен только для Mac, а не для iOS. - person azdev; 03.02.2012
comment
Вы правы, конечно, используйте CGRectIntegral() вместо этого. - person EightyEight; 03.02.2012

Простите мое невежество, если это неверно, я ничего не знаю об iPhone или Cocoa.

Если вы просите центрировать текст в прямоугольнике, вам также может потребоваться убедиться, что ширина и/или высота прямоугольника являются четными числами.

person Mark Ransom    schedule 19.03.2009
comment
Спасибо. Я округлил все точки и по ширине и по высоте. Также округлены баллы для свойства center. До сих пор нет кости. - person ; 20.03.2009

У меня тоже была эта проблема, но мое решение отличается и может кому-то помочь. Моя проблема заключалась в размытии текста после изменения размера объекта UIView через TouchesBegan и CGAffineTransformMakeScale, а затем обратно на CGAffineTransformIdentity в TouchesEnded.

Я пробовал изменять размер текста и округлять центральные точки x и y, но ничего не получалось. Решение моей проблемы состояло в том, чтобы использовать четные размеры для ширины и высоты моего UIView !!

Надеюсь это поможет ....

person peterpotboiler    schedule 30.09.2010

Судя по моим экспериментам, некоторые шрифты нечетко отображаются при определенных размерах. например Helvetica-Bold не отображает "." хорошо на 16.0f, но они четкие на 18.0f. (Если вы внимательно посмотрите, верхний пиксель «.» размыт.)

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

person Kelvin    schedule 06.07.2009

В моем случае я нарисовал текст на пользовательском CALayer и получился довольно размытым. Я решил это, установив contentScale с соответствующим значением:

Цель-C:

layer.contentsScale = [UIScreen mainScreen].scale;

Быстрый:

layer.contentsScale = UIScreen.main.scale
person Ke Yang    schedule 16.03.2018