0

我整天都在寻找解决方案。

我有 4 个 NSTextFields(实际上是一些自定义操作的子类),它们都共享相同的 X 位置。

问题是,有些有不同的风格(浅色、常规、粗体)并且可能有不同的尺寸。

发生的情况是,即使 X 原点相同,第一个字母总是有一点(始终不同)左边距。

请看图片:https ://dl.dropbox.com/u/1977230/Screen%20Shot%202012-12-11%20at%2017.55.58.png

我想确保所有行都从同一点开始,比如从左边开始 100px。

知道如何覆盖那个奇怪的填充吗?

干杯

4

3 回答 3

6

您所说的边距我很确定是lineFragmentPadding.NSTextContainerNSTextField

请参阅 NSTextContainer 参考:

http://developer.apple.com/library/Mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextContainer_Class/Reference/Reference.html

这是文本布局教程中的一个页面:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Concepts/CalcTextLayout.html

在那篇文章中指出:

排版机在将文本实际放入矩形时进行最后一次调整。这种调整是由 NSTextContainer 对象固定的一个小量,称为线片段填充,它定义了线片段矩形每一端留空的部分。文本以该数量插入线片段矩形内(矩形本身不受影响)。填充允许在边缘和任何孔周围对文本容器的区域进行小规模调整,并防止文本直接邻接该区域附近显示的任何其他图形。您可以使用 setLineFragmentPadding: 方法从默认值更改填充。请注意,行片段填充不是表示边距的合适方法;

不幸的是,它看起来像NSTextField'sNSTextContainer并且NSLayoutManager是私有且不可访问的,但似乎它们可以在 中访问NSTextView

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/Reference/Reference.html#//apple_ref/occ/cl/NSTextView

因此,如果您想对此类功能进行细微控制,那么这可能是您需要子类化的类。

于 2012-12-26T08:38:55.523 回答
2

你看过CoreText吗?我认为它可能会提供设施来做你正在寻找的东西。从文档...

Core Text 布局引擎专门设计用于使简单的文本布局操作易于执行并避免副作用。

您可以访问“字体指标”,这使您能够(从文档中)...

对于每种字体,字形设计者都会提供一组测量值,称为度量,用于描述字体中每个字形周围的间距。排版机使用这些指标来确定字形位置。字体度量是诸如上升、下降、前导、大写高度、x 高度等参数。

编辑:这可能NSTextField不是为您想要做的事情而设计的。NSTextField除了NSLayoutManager. 您可能需要升级到NSTextView始终具有专用NSLayoutManager附件的 . Apple 有一些示例项目,您可以使用NSLayoutManager和搜索NSTextView

于 2012-12-12T18:59:31.677 回答
1

如果您使用 NSTextField 来绘制简单的静态文本,请查看AppKit 对 NSString 的添加。用于sizeWithAttributes:获取“文本”图像的大小。然后使用大小来计算绘制的矩形。最后使用其中一种draw方法来实际绘制文本。不要忘记“四舍五入”的结果sizeWithAttributes!它不是像素对齐的。

但是,如果您需要绘制比简单标签更复杂的东西,请使用 Core Text。您可以在twui 源代码中找到如何使用它的非常好的示例。

于 2012-12-19T16:32:41.403 回答