基于视图的NSOutlineview选择渐变

时间:2011-08-27 11:45:18

标签: objective-c cocoa macos selection nsoutlineview

我仍然在我的小Cocoa应用程序中苦苦寻找基于视图的NSOutlineView。我正在尝试使用finder之后模拟我的OutlineView。当Finder OutlineView失去焦点(例如,单击右侧的任何文件夹)时,所选行(例如桌面)将保持选中,使用亮蓝色渐变,并且不会更改为无效的蓝灰色渐变。

我想在我的应用程序中复制此行为。

在基于非视图的OutlineView中,我能够继承NSOutlineView并重新实现(void)highlightSelectionInClipRect:(NSRect)clipRect,这样每个突出显示的行都可以提供明亮的蓝色背景图像。

但是,现在使用基于视图的OutlineView(设置为SourceList样式),这个方法显然甚至都没有被调用。我甚至已经实现了(id)_highlightColorForCell:(NSCell *)cell以返回零,正如一些网站建议的那样,但这也无济于事。

关于如何在基于视图的OutlineView中设置高光渐变的任何提示?

2 个答案:

答案 0 :(得分:8)

你在做任何可能搞乱事情的自定义绘图吗?据我所知,所有的选择绘图都是正常处理的,请查看TableViewPlayground example(默认情况下不是源列表样式,但这是对XIB的简单更改)。

但是失败了,根据highlightSelectionInClipRect:

上的Mac OS X 10.7 doc条目
  

注意:对于基于视图的表视图,不应对此方法进行子类化或重写。   相反,行绘制自定义应该通过继承NSTableRowView来完成。

所以我认为(我还没有尝试过任何一个)就像你想要继承NSTableRowView,覆盖drawSelectionInRect:(TableViewPlayground中有一个example,并绘制你的选择。你可以查看对于使用[NSApp active]处于活动状态的应用,或者像示例一样使用self.emphasized属性。

然后,您将在NSOutlineViewDelegate协议方法中返回一个自定义NSTableRowViews(仅限10.7!):(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item

希望这有效/有帮助!

我应该注意TableViewPlayground示例默认使用outlineView:viewForTableColumn:item:委托方法并使用NSTableViewCells执行所有操作,但是如果您添加我在上面提到的rowViewForItem方法,则 被调用。所以我猜你可以用它来为它的每一行返回一个视图。

答案 1 :(得分:6)

谢谢你的提示,我能够很容易地解决问题。我将NSTableRowView子类化并覆盖-(BOOL) isEmphasized以始终返回true。

然后我在我的OutlineViews委托中实现-(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item,通过调用ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];

返回我的子类的项目特定实例

编辑:除此之外,通过将新的NSView对象放入Interface Builder中的OutlineView,似乎还有一种非常隐蔽的方式来使用自定义NSTableRowView子类。然后根据Apple documentation将views类设置为子类,并为其指定用户接口项标识符“NSTableViewRowViewKey”。