我想知道如何在NSOutlineView
中设置所选项目的背景。通过将SelectionHighlightStyle
设置为NSTableViewSelectionHighlightStyleSourceList
,我获得了标准的强烈蓝色突出显示模式。
我能够更改所选NSTextFieldCell
的背景,但该行背景的左侧部分仍为标准蓝色。此外,我无法定义渐变。
所以我发现我必须使用自定义视图并找到NSTableRowView
。但由于我正在研究 10.6.8 ,我想知道是否还有其他可能性来创建自定义渐变高亮样式。更好的是将NSTableRowView
作为一个整体使用的替代方法。
我在任何课程参考或授权中都没有找到任何信息来实现这一点。如果没有这样的话,Apple如何在XCode 4.2中设计和开发源列表?蓝色更浅,顶部元素有两行。
答案 0 :(得分:3)
基于视图的NSTableViews / NSOutlineViews仅适用于10.7及更高版本,因此如果您尝试支持10.6.8,则任何使用NSTableRowView的解决方案都将无效。我这样做的方法是使用自定义的NSOutlineView子类。然后覆盖-highlightSelectionInClipRect:
和-drawBackgroundInClipRect:
。在-highlightSelectionInClipRect:
中,您将为所选行绘制渐变突出显示,您可以使用-selectedRowIndexes
和-rectOfRow
来获取。
完成所有这些操作的代码并不是非常简单,但我之前已经完成了,所以这绝对是可能的。有一点让我头疼的问题是内部-drawBackgroundInClipRect:
从-[NSOutlineView drawRect]
和直接由-[NSClipView drawRect]
调用。方法的调用者确定clipRect
参数所在的坐标空间。您可以使用此代码片段来确保它位于NSTableView的坐标空间中:
- (void)drawBackgroundInClipRect:(NSRect)clipRect
{
clipRect = [self convertRect:clipRect fromView:[NSView focusView]];
// Now do your background drawing.
// Easy if it's a solid background, more complex if you want alternating row colors
}
如上所述,如果您可以继续使用基于视图的NSTableView / NSOutlineView并放弃对10.6的支持,那么这将变得更容易 。在这种情况下,您根本不必继承NSOutlineView的子类,并且可以在简单的NSTableRowView和NSTableCellView子类中完成所有自定义绘图。