ios - NSTextAttachment 自定义 View

标签 ios objective-c cocoa-touch textkit nstextattachment

是否可以在 iOS 上要显示 NSTextAttachment 的位置显示自定义 View ?我有自定义文本存储和布局管理器子类,但我不确定将代码放在哪里才能实际添加 subview 。

(我想要这个的原因是为了支持内联方程式编辑。我有一个自定义文本字段类,它允许用户键入一个方程式,我希望将这个 View 添加到另一个 TextView 的正文中.)

我看过 this tutorial , 虽然它看起来是一个很好的起点,但它没有涵盖实际绘制文本附件的位置。因此,具体来说,我应该覆盖哪些方法来添加自定义 View 来代替默认的文本附件图标

如果我想做的事情可行,或者我是否以错误的方式进行,请告诉我。感谢您的帮助!

最佳答案

你想做的事情是可能的,尽管框架架构没有直接预见到。文本附件被设计为一种被动元素,它们是文本的一部分,不会暴露任何特殊或单独的交互。本质上它们只是绘图对象。但是……如果您知道布局过程是如何工作的,您可以插入您的自定义 View 。

要在每次相关更改时更新布局,您需要重写此方法并在每次调用时定位 View :

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

由于它经常被调用,请确保它的实现足够有效。在调用此方法期间插入和删除 View 以及更改相应 View 的框架也应该是安全的。像这样获取字形范围的字符范围:

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

接下来,遍历您的自定义存储以查找所有公式附件。对于这些附件中的每一个,从布局管理器中获取字形的布局边界,例如使用此方法:

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

然后将 View 的框架更新为返回的矩形并从那里获取它。

关于ios - NSTextAttachment 自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860948/

相关文章:

ios - touchesBegan 未被调用

objective-c - 应用程序被 iOS 杀死后,NSURLConnection sendSynchronousRequest/sendAsynchronousRequest 失败

ios - 在 Facebook 和 Twitter 上共享网页内容不起作用 - WebKit iOS Swift

objective-c - 核心数据属性唯一性

ios - 为什么我下载头像的函数被调用了数千次?

android - 如何删除插件 google+?

objective-c - 如何使 NSWindowController 在 OSX Lion 中以全屏模式运行?

ios - 如何在 Sprite 套件游戏的触摸方法中编写 UIbuttons/IBactions

ios - 从 UITableView 中删除所有行

iphone - iOS 应用程序登录流程