gpt4 book ai didi

macos - 我是否在核心文本中遗漏了一些内容,可以让我看到某个点位于哪一行以及一行的实际高度(包括段落样式)?

转载 作者:行者123 更新时间:2023-12-03 17:48:16 25 4
gpt4 key购买 nike

所以我试图编写一个带有文本的自定义 NSView,但不使用 NSTextView (因为它不仅仅是文本)。我可以使用 Core Text 来绘制文本,但现在我还需要能够进行 HitTest 以及插入符号和选择矩形的绘制。

绘制插入符号和选择的简单方法,如各种 Apple 示例所示,是获取包含所需字符串范围的各种 CTLine 的打印边界(使用 CTLineGetBoundsWithOptions(0) 而不是 CTLineGetTypgraphicBounds() 由于后者存在各种错误)并填充结果矩形。不幸的是,一旦存在任何类型的段落样式(无论是段落间距、行距或行高),它就会停止工作,因为段落样式包含在打印边界中。如果您选择跨越多行的文本,您会看到行之间有一些标志性的白色间隙!这仍然没有回答如果我单击行之间的空白如何知道要使用哪一行的问题。

由于 Core Text 默认情况下将指标捕捉到整数的方式,在打印边界矩形重叠或它们之间有间隙的斗争之后,我注意到如果我调用 CTFrameGetLineOrigins() 我可以确定高度通过计算origins[i].y - origins[i + 1].y来计算第i + 1行;第 0 行的高度是框架的高度减去其他行组合的高度。这里使用i + 1很重要;它处理由空间高度与其他字符高度不同的字体引起的奇怪情况。

但是,使用这种技术,我无法区分行上方的间距和行下方的间距,无论该空间是段落还是行间距。所有间距都被视为在线上方,如果使用多种间距模式,它们只会组合起来。我有a small program您可以用它自己进行实验;单击“基线差异”复选框以显示行高。

所以问题是:无论段落样式如何,我都无法弄清楚一条线到底有多高以及它的基线相对于其高度的位置,我错过了什么?或者如果我想这样做,我需要自己重新实现Core Text的内部逻辑吗?我确实有很多碎片,但其中很多都是高度有条件的......

最后一段发生了什么?我应该模拟那里的尾随空格吗?

该解决方案需要在 OS X 10.8 或更高版本上运行。

谢谢。

最佳答案

您需要问自己的一个大问题是您想要这些事情的结果。线的高度实际上只是线的高度。它不包括行之间的间距。排字机不必将所有行堆叠起来。考虑两列布局情况,其中一行可能高于前一行。或者是否有分页符;您认为页面边距是行高的一部分吗? Core Text 不仅仅处理“类似 TextView 的事情”。它可以处理相当任意的布局情况。

您自己遇到了一个难题:行之间的空间应该属于哪一行。这是一个需要你回答的问题。核心文本不知道你想要什么。它不知道这些矩形的含义,也不知道它们如何协同工作。

因此,对于选择问题,是的,您需要通过创建完全选择的所有线矩形(加上第一行和最后一行上的额外位)的并集来计算整个框。对于简单的单列文本通常就是这样做的;显然,如果文本可以跨越多列,事情会变得更加复杂。您可能还必须考虑文本“向后”流动的情况(即在通常从左到右的文本中从右到左)。

仅使用低级核心文本原语需要进行大量工作。我首先尝试使用 NSLayoutManager 来代替,看看它是否足够强大来满足您的目的。如果您的问题只是需要环绕(或跳过)图形或其他非文本元素,那么 NSLayoutManager 可能能够完成很多的工作为您提供并让您仍然使用 NSTextViewNSLayoutManager 是高度可子类化的,可以自定义其行为,并且使用它,您通常可以保留 Cocoa 的内置选择功能,而无需重新实现它们。

关于macos - 我是否在核心文本中遗漏了一些内容,可以让我看到某个点位于哪一行以及一行的实际高度(包括段落样式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41601845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com