NSString sizeWithFont: возвращать противоречивые результаты? известная ошибка? - PullRequest
1 голос
/ 31 мая 2010

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

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

Я использую NSString sizeWithFont, чтобы измерить мою строку, чтобы иметь возможность правильно ее расположить.

Но я заметил, что базовая линия шрифта в возвращаемом прямоугольнике изменяется на +/- 1 пиксель в зависимости от установленного размера шрифта. Вот мой код:

NSString* ctxt = [text substringToIndex:1];
NSString* ttxt = [text substringFromIndex:1];

CGSize sz = [ctxt sizeWithFont: cfont ];
clbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, sz.width, sz.height)];
clbl.text = ctxt;
clbl.font = cfont;
clbl.backgroundColor = [UIColor clearColor];
[contentView addSubview:clbl];

CGSize sz2 = [ttxt sizeWithFont: tfont];
tlbl = [[UILabel alloc] initWithFrame:CGRectMake(sz.width, (sz.height - sz2.height), sz2.width, sz2.height)];
tlbl.text = ttxt;
tlbl.font = tfont;
tlbl.backgroundColor = [UIColor clearColor];
[contentView addSubview:tlbl];

Если я использую 12.0 и 14.0 в качестве размеров, он работает нормально. Но если я вместо этого использую 13.0 и 15.0, то первый символ будет на 1 пиксель слишком высоким.

Это известная проблема?

Какие-нибудь предложения, как обойти это?

Создание UIWebView с помощью страниц CSS и HTML кажется излишним для этого. и больше работы для обработки динамических строк. Это то, что я должен делать?

1 Ответ

1 голос
/ 31 мая 2010

Нашел ответ ...

Конечно, я также должен проверить значение спуска по шрифту и компенсировать это в макете.

Новый прямоугольник для второй метки: CGRectMake (sz.width, (sz.height - sz2.height) + floor (cfont.descender - tfont.descender), sz2.width, sz2.height)

floor () должен убедиться, что он привязан к положению пикселя, иначе шрифт будет выглядеть размытым

...