不使用NSTableRowView的NSOutlineView单元格自定义视图

时间:2012-03-05 23:28:15

标签: macos cocoa xcode4.2 nsoutlineview

我想知道如何在NSOutlineView中设置所选项目的背景。通过将SelectionHighlightStyle设置为NSTableViewSelectionHighlightStyleSourceList,我获得了标准的强烈蓝色突出显示模式。

我能够更改所选NSTextFieldCell的背景,但该行背景的左侧部分仍为标准蓝色。此外,我无法定义渐变。

所以我发现我必须使用自定义视图并找到NSTableRowView。但由于我正在研究 10.6.8 ,我想知道是否还有其他可能性来创建自定义渐变高亮样式。更好的是将NSTableRowView作为一个整体使用的替代方法。

我在任何课程参考或授权中都没有找到任何信息来实现这一点。如果没有这样的话,Apple如何在XCode 4.2中设计和开发源列表?蓝色更浅,顶部元素有两行。

1 个答案:

答案 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子类中完成所有自定义绘图。