NSTextField奇怪的左边距

时间:2012-12-11 17:59:55

标签: objective-c cocoa margin nstextfield

我一直在为这一天寻找解决方案。

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

问题是,有些人有不同的风格(浅色,普通,粗体),可能有不同的尺寸。

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

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

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

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

干杯

3 个答案:

答案 0 :(得分:6)

您所谈论的保证金我非常确定lineFragmentPadding使用NSTextContainer上的NSTextField

请参阅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:方法的值。注意线条片段   填充不是表达边际的合适手段;你应该设置   NSTextView对象的文档边距或位置的大小和大小   文本边距的段落边距属性。

不幸的是,看起来NSTextField的{​​{1}}和NSTextContainer是私有且无法访问的,但看起来它们可以在NSLayoutManager中访问:

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

如果你想要对这种功能进行微小的控制,那么你可能需要继承这个类。

答案 1 :(得分:2)

你看过CoreText吗?我认为它可以提供你正在寻找的设施。来自文档...

  

Core Text布局引擎专门设计用于简化文本布局操作并避免副作用。

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

  

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

编辑:     可能NSTextField不是为你想要做的而设计的。 NSTextField除了NSLayoutManager之外还执行自定义布局。 您可能需要升级到NSTextView,该NSLayoutManager始终附加专用的NSLayoutManager。 Apple有一些您可以使用NSTextView和{{1}}搜索的示例项目。

答案 2 :(得分:1)

如果您使用NSTextField绘制简单的静态文本,请查看AppKit additions to NSString。使用sizeWithAttributes:获取“文本”图片的大小。然后使用大小来计算绘图的rects。最后使用draw方法之一来实际绘制文本。不要忘记sizeWithAttributes的“圆”结果!它不是像素对齐的。

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