基于视图的NSOutlineview选择渐变

Bin*_*cks 5 macos cocoa objective-c selection nsoutlineview

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

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

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

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

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

Chu*_*uck 8

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

但是失败了,根据Mac OS X 10.7 doc条目 highlightSelectionInClipRect:

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

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

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

希望这有效/有帮助!

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


Bin*_*cks 6

谢谢,通过你的提示,我能够很容易地解决问题.我继承NSTableRowView并覆盖-(BOOL) isEmphasized以始终返回true.

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

编辑:除此之外,通过将新的NSView对象放入Interface Builder中的OutlineView,似乎还有一种非常隐蔽的方式来使用自定义NSTableRowView子类.然后根据Apple文档将views类设置为您的子类,并为其提供"NSTableViewRowViewKey"的用户界面项标识符.