NSOutlineView源列表样式,基于视图,更改字体

Amy*_*all 5 cocoa nsoutlineview

我正在使用具有源列表样式的NSOutlineView,并使用基于视图(而不是基于单元格)的大纲视图.

我希望能够使一些行变粗.但是,我尝试更改字体(在IB中手动,通过viewForTableColumn中的代码:......,或通过Font Bold绑定)到目前为止都被忽略了.

从这条消息来看,这似乎是因为NSOutlineView的源列表样式接管了文本字段的外观:

我猜你已经将你的文本字段连接到NSTableCellView的textField出口了?如果是这样,我认为您可能会遇到NSTableView对源列表的外观自动管理.

尝试从textField插座断开文本字段,看看您的自定义字体是否粘贴.

如果我断开textField插座,外观确实在我的控制之下,我的插件工作.

但是,现在我不能让它看起来像自动的.我的意思是,当NSOutlineView管理文本字段的外观时,字体是粗体并且在选择任何项目时获得了投影,但是当我手动管理它时,情况并非如此.

任何人都可以回答以下问题之一:

  1. 当NSOutlineView管理文本字段的外观时,如何使字体粗体绑定起作用
  2. 如果我没有NSOutlineView管理我的文本字段的外观,我怎么能让它看起来和行为就像我管理它一样?

Max*_*ann 6

我想我找到了解决方案:

NSTableCellViewtextField通过backgroundStyle在包含控件的单元格上设置属性来管理其出口的外观.将其设置为NSBackgroundStyleDark触发一个特殊路径,NSTextFieldCell其中实际上设置了一个attributedStringValue,更改文本颜色并添加阴影NSShadowAttributeName.

你能做的是两件事:

  • backgroundStyle在自定义行或单元视图子类中自行设置.
  • NSTextFieldCell在单元格的文本字段中使用自定义并更改行为/绘图.

我们做了后者,因为我们需要一个主题(不同颜色)表视图的不同外观.我们为此找到的最方便(尽管肯定不是最有效)的位置是- drawInteriorWithFrame:inView:在调用super之前覆盖和修改单元格的属性字符串,然后恢复原始字符串:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSAttributedString *originalString = self.attributedStringValue;

    // Customize string as you like
    if (/* whatever */)
        [self setAttributedStringValue: /* some string */];

    // Regular drawing
    [super drawInteriorWithFrame:cellFrame inView:controlView];

    // Reset string
    if (self.attributedStringValue != originalString)
        self.attributedStringValue = originalString;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助处于类似情况的其他人.