核心文本 - 从 NSRange 获取像素坐标
如何从 NSRange
获取使用 Core Text 渲染的文本的 CGRect
?
我正在将 Core Text 与 NSAttributedString
一起使用。
How would I get a CGRect
from an NSRange
for text rendered with Core Text?
I am using Core Text with an NSAttributedString
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先确定您感兴趣的范围所在的行。然后调用
CTLineGetOffsetForStringIndex()
获取特定字符串位置距行首的偏移量。与CTLineGetImageBounds()
一起,应该可以计算范围内第一个和最后一个字符的CGPoint
位置。FIrst determine the line(s) in which the range you are interested in lies is. Then call
CTLineGetOffsetForStringIndex()
to get an offset of a specific string position from the start of the line. Together withCTLineGetImageBounds()
, it should be possible to calculate aCGPoint
position of the first and last characters in your range.这是绝对的痛苦,但可以做到。
您需要使用
CTFrameGetLines()
获取框架中的所有行,使用CTLineGetStringRange()
检查它们的字符范围是否在您要查找的范围内,使用CTLineGetTypgraphicBounds()
查找线条本身渲染的大小,并使用CTLineGetOffsetForStringIndex()
确定范围开始/结束字符的实际位置(如果线只是所需范围的子范围)。将所有这些结合起来并添加偏移量和高度等可以得到您想要的东西。请注意,如果没有图形上下文,CTLineGetImageBounds() 就无法工作(而且,据我所知,它的成本相当昂贵),并且没有必要解决此问题。
It is an absolute pain but can be done.
You need to get all of the lines in the frame using
CTFrameGetLines()
, check if their character range is in the range you're looking for usingCTLineGetStringRange()
, useCTLineGetTypographicBounds()
to find how big the line itself would render as, and useCTLineGetOffsetForStringIndex()
to determine the actual position of the start/end character of the range (if the line is just a subrange of the desired range).Combining all of this and adding up offsets and heights and such can get you what you want. Note that
CTLineGetImageBounds()
doesn't work without a graphics context (and, from what I gather, it is pretty expensive anyway) and is not necessary to solve this problem.