My ultimate goal is to give the user the ability to split a text inside an NSTextView or UITextView into several sections, where two subsequent sections are visually separated by a custom view separator (possibly, but not necessarily a horizontal rule – I want to be able to adjust the visual appearance of the separator without a hassle).
I need a solution that works on both platforms: macOS and iOS.
(My related question focused on a solution for macOS and there is one that makes use of NSTextAttachmentCells which are not available on iOS.)
My current approach to tackling this problem is the following:
- I have a button in the window's toolbar to insert a section break.
When the user taps that button, I create a new attributed string with no text but with a text attachment:
let attachment = SectionChangeTextAttachment() let attachmentString = NSAttributedString(attachment: attachment)(
SectionChangeTextAttachmentis a custom subclass ofNSTextAttachmentthat I created in order to be able to distinguish this section break attachment from other possible attachments.)I insert that
attachmentStringto text storage at the current cursor position:textStorage.insert(attachmentString, at: textView.selectedRange().location)I create a custom
NSLayoutManagersubclass. Its task is to find all the attachments of classSectionChangeTextAttachmentand replace all occurrences with a separator drawing (or glyph?). And here's the problem: With Apple's limited and partially outdated documentation, I cannot figure out how to do this.
So my question is:
How can I make my layout manager replace attachment characters (with a specific attachment) with a custom drawing (of a separator) that takes up more space than the character / glyph?
(I guess there is no glyph for the attachment character and thus the layout manager doesn't provide any space for it.)
Which methods do I need to override in order to make this work?
(Does this approach even make sense to begin with?)
