Основной текст точно такой же, как текстовый формат UITextView? - PullRequest
11 голосов
/ 15 октября 2010

Я пытаюсь настроить CTFrame, который точно соответствует текстовому формату моего UITextView в iPad. Прежде всего, я преобразовал текст UITextView в строку с атрибутом. Затем я установил ширину и высоту окна рисования, в котором Core Text будет рисовать текст. Мне удалось нарисовать текст с использованием Core Text, но UITextView и Core Text показывают немного разные результаты, хотя я использовал тот же шрифт и размер. В частности, когда я использовал [UIFont systemFontOfSize:21], каждый пробел в UITextView имеет на один пиксель больше, чем результат Core Text.

Это нормально для короткого предложения или слова, но если UITextView и Базовый текст состоят из нескольких строк, их результат становится совсем другим. Например, UITextView выполняет перенос слов для одного слова в конце строки, в то время как Core Text сохраняет это слово в той же строке. Если вы видите прикрепленное изображение, начальные позиции последнего слова «абзац» уже сильно отличаются (8-пиксельный разрыв из-за 8 пробелов).

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

Я использую Core Text, чтобы найти пиксельную позицию текущего курсора в UITextView, поэтому они оба должны идеально совпадать друг с другом, содержать одинаковое количество символов и слов в каждой строке.

Вопрос: Есть ли способ сделать объект Core Text, который идеально соответствует текстовому формату UITextView?

Спасибо!

Вот код, как я настраиваю атрибутивную строку. (Я просто следовал Основному текстовому руководству.)

CTFontRef font = CTFontCreateWithName((CFStringRef) [UIFont systemFontOfSize:21.0].fontName, 21.0, NULL);
CFMutableAttributedStringRef attrString2 = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringReplaceString (attrString2, CFRangeMake(0, 0), (CFStringRef) string);
CFAttributedStringSetAttribute(attrString2, CFRangeMake(0, [string length]),kCTFontAttributeName, font);

-

-

Вот картинка.

alt text

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Ваше решение может работать для определенного шрифта с определенным размером точки, но вы не можете полагаться на него в целом. CoreText просто не совместим с обычными UILabels, UITextView: s или UIStringDrawing, поэтому вы не можете смешивать их.

Либо вы должны использовать только функции CT для всей обработки строк (включая реализацию пользовательского ввода, если это то, что вам нужно), либо не использовать их вообще.

1 голос
/ 16 октября 2010

Ответь себе.Я только что нашел очень простое решение!Используя любой редактор шрифтов, вы можете просто изменить ширину пробела (значение ascii 32);оригинальный шрифт для UITextView и модифицированный шрифт для Core Text или наоборот.Я использовал бесплатный редактор шрифтов FontForge.Хотя мне по-прежнему приходится выполнять некоторые тесты в крайнем случае, такие как написание японских символов и букв английского алфавита в одной строке и т. Д., Теперь становится почти возможным найти позицию курсора / каретки в пикселях в UITextView.

...