【问题标题】:NSTextField weird left marginsNSTextField 奇怪的左边距
【发布时间】:2012-12-26 16:38:55
【问题描述】:

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

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

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

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

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

我想确保所有的行都从同一个点开始,比如距离左边 100 像素。

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

干杯

【问题讨论】:

  • 我应该补充一点,灰色块是 NSTextField 背景,如您所见,它们已正确对齐。
  • 这个post 可能有帮助吗?或者我想知道是否尝试仅使用固定宽度字体会起作用
  • 固定宽度字体可以,但我需要使用品牌的字体:/ 我认为那篇文章并没有真正的帮助,因为我只需要将第一个字母向左对齐。下一个很好,相互关联。但是,第一个字母可能是随机的,所以我事先不知道它的间距是多少:(
  • 你能根据第一个字符的前导空间来调整视图的位置吗?所以与我上面链接的帖子不完全一样,但类似,祝你好运。

标签: objective-c cocoa margin nstextfield


【解决方案1】:

你说的边距我很确定是NSTextContainer 上的lineFragmentPaddingNSTextField 使用。

参见 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 对象的位置和大小的文档边距或 文本边距的段落边距属性。

不幸的是,看起来NSTextFieldNSTextContainerNSLayoutManager 是私有且不可访问的,但似乎它们可以在NSTextView 中访问:

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

因此,如果您想对此类功能进行细微控制,则可能需要将其子类化。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我没有调查过。现在就去试试吧!谢谢
    • 该死的地狱。对于以前从未听说过 CoreText 的人来说,CoreText 可能真的很复杂。将向 OP 添加赏金,以查看我是否可以获得有关如何执行此操作的示例。感谢您的帮助
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 2011-10-11
      • 2011-04-29
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2012-11-29
      相关资源
      最近更新 更多