Основной текст точно такой же, как текстовый формат UITextView?

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

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

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

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

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

Спасибо!

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

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

Ответ 1

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

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

Ответ 2

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