好的,这就是我所做的:
NSCollectionView
NSCollectionViewItem
(以启用选择)NSView
视图创建了NSCollectionViewItem
子类,以便绘制边框视图项
@implementation MSLibraryCollectionViewItem
- (void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setNeedsDisplay:YES];
}
自定义视图
@implementation MSLibraryCollectionViewView
/***************************************
Initialisation
***************************************/
- (MSLibraryCollectionViewView*)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
/***************************************
Drawing
***************************************/
- (void)drawRect:(NSRect)rect
{
if ([self selected]) {
//[[NSColor redColor] setFill];
//NSRectFill(rect);
//[super drawRect:rect];
NSColor* gS = [NSColor colorWithCalibratedRed:0.06 green:0.45 blue:0.86 alpha:1.0];
NSColor* gE = [NSColor colorWithCalibratedRed:0.12 green:0.64 blue:0.94 alpha:1.0];
NSGradient* g = [[NSGradient alloc] initWithStartingColor:gE endingColor:gS];
NSColor *borderColor = [NSColor colorFromGradient:g];
NSRect frameRect = [self bounds];
if(rect.size.height < frameRect.size.height)
return;
NSRect newRect = NSMakeRect(rect.origin.x+5, rect.origin.y+5, rect.size.width-10, rect.size.height-10);
NSBezierPath *textViewSurround = [NSBezierPath bezierPathWithRoundedRect:newRect xRadius:7 yRadius:7];
[textViewSurround setLineWidth:2.0];
[borderColor set];
[textViewSurround stroke];
}
}
然而,绘图似乎有些不对劲。例如:
发生了什么事?
PS 我不是Cocoa中有绘图和自定义视图的大师 - 所以任何想法/帮助都非常受欢迎! < / p>
答案 0 :(得分:1)
你从询问集合视图转向谈论大纲视图,但我认为这只是一种精神上的打击。
- 当“大纲视图”项目不是100%可见时(例如因为它已向下滚动),选择边框根本不会显示 (虽然我希望它只画出可见部分)。
这是因为-drawRect:
中的代码。
if(rect.size.height < frameRect.size.height)
return;
它特别避免绘制部分选择大纲。
关于奇怪的一行,我怀疑这与您的收藏品视图的自定义绘图有关。如果禁用自定义绘图,是否会停止发生?您可以尝试使用普通颜色,而不是使用您正在使用的第三方+colorFromGradient:
代码。
顺便说一句,这一行:
NSRect newRect = NSMakeRect(rect.origin.x+5, rect.origin.y+5, rect.size.width-10, rect.size.height-10);
可以简单地写成:
NSRect newRect = NSInsetRect(rect, 5, 5);