Amy*_*all 5 cocoa nsoutlineview
我正在使用具有源列表样式的NSOutlineView,并使用基于视图(而不是基于单元格)的大纲视图.
我希望能够使一些行变粗.但是,我尝试更改字体(在IB中手动,通过viewForTableColumn中的代码:......,或通过Font Bold绑定)到目前为止都被忽略了.
从这条消息来看,这似乎是因为NSOutlineView的源列表样式接管了文本字段的外观:
我猜你已经将你的文本字段连接到NSTableCellView的textField出口了?如果是这样,我认为您可能会遇到NSTableView对源列表的外观自动管理.
尝试从textField插座断开文本字段,看看您的自定义字体是否粘贴.
如果我断开textField插座,外观确实在我的控制之下,我的插件工作.
但是,现在我不能让它看起来像自动的.我的意思是,当NSOutlineView管理文本字段的外观时,字体是粗体并且在选择任何项目时获得了投影,但是当我手动管理它时,情况并非如此.
任何人都可以回答以下问题之一:
我想我找到了解决方案:
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)
希望这可以帮助处于类似情况的其他人.