UITextField размытый текст - PullRequest
       20

UITextField размытый текст

10 голосов
/ 10 августа 2009

У меня проблема с размытостью / сглаживанием текста в UITextField даже при стандартном размере шрифта. Текст будет четким, когда элемент управления будет первым респондентом, но снова размыт, когда он потеряет фокус:

alt text
(источник: mikeweller.com )

Кто-нибудь знает, как это исправить?

Ответы [ 8 ]

26 голосов
/ 10 августа 2009

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

12 голосов
/ 10 августа 2009

ОК. Я отвечаю на свой вопрос здесь.

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

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

textFieldWidth = 300;
textFieldHeight = 31;
offsetX = 0;
offsetY = (superview.bounds.size.height - textFieldHeight) / 2;

textField.frame = CGRectMake((int) offsetX,
                             (int) offsetY,
                             (int) textFieldWidth,
                             (int) textFieldHeight);

Существует также функция CGRectIntegral, которую можно использовать для преобразования CGRect в целочисленные значения.

1 голос
/ 25 февраля 2010

В дополнение к использованию нефракционного позиционирования необходимо использовать нецентрированное вертикальное выравнивание для UITextField. Похоже, вертикальное выравнивание по центру в сочетании с нечетным размером шрифта также приводит к размытому тексту.

0 голосов
/ 15 июня 2018

Решение от этого сайта объясняет, что это может быть связано с изменением размера, и iOS не заботится об этой ошибке для слоев, а только для различных видов. Я обновил его до Swift 4:

view.contentScaleFactor = UIScreen.main.scale
0 голосов
/ 31 мая 2010

Просто установив высоту кадра UITextField равным четному значению, я сделал это.

0 голосов
/ 21 апреля 2010

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

CGRect temp = textField.frame;
temp.origin.x = round(temp.origin.x);
temp.origin.y = round(temp.origin.y);
textField.frame = temp;
0 голосов
/ 15 марта 2010

Я пытался использовать CGRectIntegral и прочее. В моем случае это изменило минимальный размер шрифта и размер шрифта в IB.

0 голосов
/ 08 октября 2009

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

UITextField в InterfaceBuilder имеет принудительную высоту кадра 31 пикселя. Его нельзя перетащить, чтобы изменить размер, и его нельзя установить в свойствах фрейма в IB. Вам нужно перейти к viewDidLoad и настроить высоту кадра на 32 пикселя, и это должно решить проблему.

Надеюсь, будущие версии IB исправят это.

...