我正在使用带有源列表样式的NSOutlineView,并使用基于视图(而不是基于单元格)的大纲视图。
我希望能够使一些行变粗。但是,我尝试更改字体(在IB中手动,通过viewForTableColumn中的代码:......,或通过Font Bold绑定)到目前为止都被忽略了。
从this message开始,这似乎是因为NSOutlineView的源列表样式接管了文本字段的外观:
我猜你已经将文本字段连接到NSTableCellView的textField出口了?如果是这样,我认为你可能会遇到NSTableView自动管理源列表的外观。
尝试断开textField插座的文本字段,看看自定义字体是否粘贴。
如果我断开textField插座的连接,外观确实在我的掌控之下,而且我的插座工作正常。
然而,现在我不能让它看起来像自动的。我的意思是,当NSOutlineView管理文本字段的外观时,字体是粗体的并且在选择任何项目时获得了投影,但是当我手动管理它时情况并非如此。
任何人都可以回答以下任何一个问题:
答案 0 :(得分:6)
我想我找到了解决方案:
NSTableCellView
通过在包含控件的单元格上设置textField
属性来管理其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;
}
希望这可以帮助处于类似情况的其他人。
答案 1 :(得分:0)
不确定我是否遗漏了您的问题中的任何内容,但使用以下作品更改了字体。 ReminderTableCellView
只是NSTableCellView的子类,添加了额外的dateField。
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
//LOG(@"viewForTableColumn called");
// For the groups, we just return a regular text view.
if ([_topLevelItems containsObject:item]) {
//LOG(@" top level");
NSTableCellView *result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
// Uppercase the string value, but don't set anything else. NSOutlineView automatically applies attributes as necessary
NSString *value = [item uppercaseString];
[result.textField setStringValue:value];
//[result.textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
return result;
} else {
//LOG(@" menu item");
// The cell is setup in IB. The textField and imageView outlets are properly setup.
// Special attributes are automatically applied by NSTableView/NSOutlineView for the source list
ReminderTableCellView *result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
if ([item isKindOfClass:[OSTreeNode class]]) {
[result.textField setFont:[NSFont boldSystemFontOfSize:13]];
result.textField.stringValue = [item displayName];
result.dateField.stringValue = [item nextReminderDateAsString];
}
else
result.textField.stringValue = [item description];
if (_loading)
result.textField.textColor = [NSColor grayColor];
else
result.textField.textColor = [NSColor textColor];
NSImage *image = [NSImage imageNamed:@"ReminderMenuIcon.png"];
[image setSize:NSMakeSize(16,16)];
[result.imageView setImage:image];
//[result.imageView setImage:nil];
return result;
}
}
结果视图如下所示。请注意,这是一个选择了Source Listing选项的NSOutlineView,但我不明白为什么这对普通的outlineView不起作用。