Как реализовать горизонтальное правило в текстовом представлении? - PullRequest
1 голос
/ 14 марта 2019

Допустим, у меня есть NSTextView (или UITextView на iOS), и я хочу, чтобы пользователь мог вставлять правила горизонтального делителя, такие как тег HTML <hr> или вот что:


Какой лучший способ реализовать это?

Документация Apple очень важна для этого.Пока у меня есть две идеи:

  1. Вставьте NSTextAttachment для каждого правила и заставьте менеджер раскладки как-то его нарисовать.

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

Обаподходы кажутся мне немного неправильными или не элегантными, потому что:

  1. Из документации кажется, что текстовые вложения предназначены для прикрепления файлов.Горизонтальное правило - это не файл.

  2. Если я использую несколько текстовых представлений, я, вероятно, потеряю некоторые настройки производительности, присущие NSTextView, так как все текстовые представления должны быть загружены иготов к отображению, независимо от того, где пользователь прокрутил.Кроме того, подход множественного просмотра текста не позволит пользователю выбрать весь текст, что является требованием в моем приложении.

Есть лучшие идеи?

1 Ответ

1 голос
/ 14 марта 2019

Я помню, как пытался сделать это несколько лет назад.Использование NSTextAttachment было методом, который работал для меня.Я пометил этот разговор с Майком Феррисом, чтобы помочь мне вспомнить, как это сделать.У меня больше нет кода, но это было довольно просто.Я вложил в подкласс NSTextAttachmentCell, что соответствует NSTextAttachmentCellProtocol.Вы переопределяете cellFrame(for textContainer: NSTextContainer, proposedLineFragment lineFrag: NSRect, glyphPosition position: NSPoint, characterIndex charIndex: Int), который дает вам доступ к его контейнеру, который может обеспечить его ширину, и у него есть фрагмент строки, который дает вам позицию y текста над вашим разделителем (плюс любой требуемый отступ).Затем просто переопределите метод draw(withFrame cellFrame: NSRect, in controlView: NSView?) и нарисуйте свой делитель.

Что касается NSData полезной нагрузки, вы можете сделать что-нибудь с этим.Может быть, вы указали ширину линии, ее отступы, цвет и т. Д.?Преимущество использования NSTextAttachment заключается в том, что он остается встроенным в сам текст, например тег <hr>.

...