Пользовательское представление NSTextAttachment

Можно ли отобразить пользовательский вид в том месте, где должен отображаться NSTextAttachment на iOS? У меня есть собственное хранилище текста и подклассы менеджера компоновки, но я не уверен, куда поместить код, чтобы фактически добавить подвид.

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

Я видел это руководство, и, хотя это кажется хорошей отправной точкой, оно не охватывает, где на самом деле рисуется текстовое вложение. Итак, в частности, какие методы следует переопределить, чтобы добавить пользовательское представление вместо значка текстового вложения по умолчанию?

Пожалуйста, дайте мне знать, возможно ли то, что я хочу сделать, или я делаю это неправильно. Спасибо за вашу помощь!


person architectpianist    schedule 25.05.2014    source источник


Ответы (1)


То, что вы хотите сделать, возможно, хотя и не предусмотрено напрямую архитектурой фреймворка. Текстовые вложения оформлены как своего рода пассивные элементы, являющиеся частью текста и не подвергающие какому-либо особому или отдельному взаимодействию. По сути, они просто рисуют объекты. Но… если вы знаете, как работает процесс компоновки, вы можете подключить свои собственные представления.

Чтобы обновлять макет с каждым соответствующим изменением, вам нужно будет перезаписать этот метод и позиционировать представления при каждом вызове:

- (void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(NSPoint)origin 

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

NSRange charRange = [self characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL];

Затем просмотрите свое пользовательское хранилище, чтобы найти все вложения формул. Для каждого из этих вложений получите границы компоновки глифа от менеджера компоновки, например. используя этот метод:

- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container

Затем обновите кадр представления до возвращенного прямоугольника и возьмите его оттуда.

person Max Seelemann    schedule 25.04.2016