选择时,NSTextField字体样式将重置

时间:2016-08-15 21:31:06

标签: macos cocoa interface-builder

上下文:

在Interface Builder中,我有一个不可编辑的标签(NSTextField)。标签的内容是使用Cocoa Bindings创建的。绑定的值是NSAttributedString(使用talue变换器创建)。见图:

Binding

值变换器实质上指定了特定字符的字体,按照Markdown格式(即Italic和Bold)。这样String - > NSAttributedString。标签attributedStringValue已正确更改

问题:

在UI中选择标签时。字体重置为IB中指定的内容,而不是NSAttributedString中设置的内容。如果你没有选择文字,那么一切看起来都不错。

点击标签之前:

enter image description here

点击/选择标签后:

enter image description here

尝试的解决方案:

  • 我已经尝试了对NSTextField进行子类化,但没有真正覆盖,这使我能够在选择文本时禁用任何字体更改。
  • 我尝试过禁用富文本。这实际上有助于不改变普通文本,但它仍然从粗体和斜体文本中删除格式
  • 大多数类似的问题都是NSTextView而不是NSTextField s

1 个答案:

答案 0 :(得分:1)

我相信我找到了这个问题的解决方案,根据上面原发帖者的评论,这个问题似乎没有解决。

我有一个可以选择但不可编辑的 NSTextField。文本是通过创建具有字体和文本颜色属性的 NSAttributedString 设置的,并将其传递给 NSTextField 的 setAttributedStringValue 方法。

问题是文本的行距错误,直到我单击一个文本字段,然后单击另一个文本字段,如下面的 GIF 所示。点击完成后,文本显示正确。

enter demonstration of the problem

在编辑前后检查 NSTextField 的文本属性时,我注意到 NSOriginalFont 设置为 .AppleSystemUIFont 12pt 而不是我的字体,即 Helvetica Neue 11pt。

之前

NSFont = "\"HelveticaNeue 11.00 pt. P [] (0x600000e46400) fobj=0x1040163d0, spc=3.06\"";
NSOriginalFont = "\".AppleSystemUIFont 12.00 pt. P [] (0x600000d8f0f0) fobj=0x10361b1a0, spc=3.39\"";

之后

NSFont = "\"HelveticaNeue 11.00 pt. P [] (0x600000e46400) fobj=0x1040163d0, spc=3.06\"";
NSOriginalFont = "\"HelveticaNeue 11.00 pt. P [] (0x600000e46400) fobj=0x1040163d0, spc=3.06\"";

我通过设置 NSAttributedString 的字体属性解决了这个问题,不仅是 NSFontAttributeName(即@"NSFont")而且@"NSOriginalFont"。

[controlText removeAttribute:NSFontAttributeName range:(NSMakeRange(0, len))];
[controlText addAttribute:NSFontAttributeName value:font range:(NSMakeRange(0, len))];
[controlText removeAttribute:@"NSOriginalFont" range:(NSMakeRange(0, len))];
[controlText addAttribute:@"NSOriginalFont" value:font range:(NSMakeRange(0, len))];