Я получил решение.
Ключ к выкладке нетекстового контента - CTRunDelegate
.Core Text
не поддерживает нетекстовое содержимое, поэтому вам необходимо выделить для них пустые места, а затем нарисовать или разместить их самостоятельно.
Часть NSAttributedString
с атрибутом kCTRunDelegateAttributeName
будет вызывать зарегистрированный обратный вызовопределить ширину каждого глифа.Это позволит вам создать пустое пространство для каждого нетекстового объекта.
Однако после рисования текста с помощью Core Text
информация о макете, сохраненная с помощью frame / line / run, будет недействительной.Поэтому вы должны рисовать / размещать нетекстовое содержимое после макета с помощью framesetter / typesetter, но перед рисованием.
Эта ссылка описывает базовое использование CTRunDelegate:
Как использовать CTRunDelegate в iPad?
Проблема с Core Text.Первоначально CTRunDelegate был разработан для поддержки переменной ширины и вертикального выравнивания с помощью CTRunDelegateCallbacks.getAscent
и CTRunDelegateCallbacks.getDescent
.Но функция вертикального выравнивания в настоящее время не работает.Это может быть ошибкой.
Я описал эту проблему здесь: Выравнивание вертикального центра текста с несколькими размерами вместо базовой линии в Core Text в iOS
Если у вас есть информация об этомпроблема, см. мой вопрос по ссылке.