1

tl; dr:如果我调用NSAttributedString'senumerateAttribute:inRange:options:usingBlock:方法,range块的参数是否传递字形范围或字符范围?

我的应用程序中有一个文本视图,它的行为需要像 Notes.app 那样,当它不处于编辑模式时,它应该显示超链接(并且它们应该是可点击的),并且它应该在点击时进入编辑模式。UITextView可编辑时不显示超链接,但如果它不可编辑,则它不会自行获得对点击的关注。在 iOS 11 之前,这可以通过使用UITapGestureRecognizer文本视图上的 a 来触发编辑来解决,但似乎有些东西(可能是拖放?)改变了手势识别器的工作方式UITextView(rdar://33009324)。

我的新的和改进的解决方案是一个自定义UIGestureRecognizer,如果它看到一个不在超链接上的点击,并让文本视图上的所有其他识别器要求它在触发前失败。这是通过处理触摸、获取它们在文本视图中的位置、获取该点的字符索引、枚举NSLinkAttributeName文本视图中的textStorage以及检查我的字符索引是否与我返回的任何超链接重叠来实现的。如果是这样,那么用户点击了一个链接,这个识别器就会失败。

但是,如果点击的字符索引确实与链接相交,我需要确保点击实际上与链接的矩形相交,因为它可能是该链接是文本视图内容中的最后一件事,而触摸实际上是在文本的最后一行下方。我可以通过获取链接范围的矩形并检查它是否与我的接触点相交来做到这一点。我可以使用boundingRectForGlyphRange:inTextContainer:它,但这会导致我的问题:链接的范围是字符范围还是字形范围?我需要先通过转换glyphRangeForCharacterRange:actualGlyphRange:吗?

4

2 回答 2

2

它返回一个字符范围。NSAttributedString对字形一无所知。在执行布局之前无法将字符转换为字形,并且NSAttributedString不包括布局信息。例如,一个NSAttributedString不知道它将被绘制到多宽的区域,没有它,你就无法知道换行符将在哪里,没有它你就无法决定在哪里放置连字。

于 2017-08-28T18:41:42.820 回答
1

NSAttributedString 对字形一无所知,是的,如果您需要知道字形在 TextKit 堆栈(例如 UITextView 的堆栈)中的位置,请让布局管理器为您转换。

于 2017-08-28T18:42:14.143 回答