您想做的事情是可能的,尽管框架架构没有直接预见到。文本附件被设计为一种被动元素,它们是文本的一部分,不暴露任何特殊或单独的交互。本质上,它们只是绘图对象。但是……如果你知道布局过程是如何工作的,你可以插入你的自定义视图。
要使用每个相关更改更新布局,您需要覆盖此方法并在每次调用时定位视图:
- (void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(NSPoint)origin
由于这经常被调用,因此请确保它的实现足够高效。在调用此方法期间插入和删除视图以及更改相应视图的框架也应该是安全的。获取字形范围的字符范围,如下所示:
NSRange charRange = [self characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL];
接下来,遍历您的自定义存储以查找所有公式附件。对于这些附件中的每一个,从布局管理器中获取字形的布局边界,例如使用以下方法:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
然后将视图的框架更新为返回的矩形并从那里获取。