NSString sizeWithFont: возвращать противоречивые результаты? известная ошибка?
Я пытаюсь создать простой пользовательский UIView, который содержит строку, нарисованную одним шрифтом, но где первый символ немного больше.
Я думал, что это будет легко реализовано с помощью двух UILabel, расположенных рядом друг с другом.
Я использую 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 ответ
Нашел ответ...
Конечно, я также должен проверить значение спуска по шрифту и компенсировать это в макете.
Новый прямоугольник для второй метки: CGRectMake (sz.width, (sz.height - sz2.height) + floor (cfont.descender - tfont.descender), sz2.width, sz2.height)
floor () должен убедиться, что он привязан к положению пикселя, иначе шрифт будет выглядеть размытым