子类化NSCollectionView后绘制问题

时间:2014-10-25 06:22:23

标签: objective-c cocoa nsview nscollectionview nscollectionviewitem

好的,这就是我所做的:

  • 我有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];
    }
}

然而,绘图似乎有些不对劲。例如:

  • 调整集合视图容器的大小时,外框出现一个奇怪的行
  • 当收集视图项目不是100%可见时(例如因为它已向下滚动),选择边框根本不会出现(我希望它只绘制可见部分)。

一些例子

NSCollectionView selected item drawing issue

NSCollectionView drawing issue

发生了什么事?


PS 我不是Cocoa中有绘图和自定义视图的大师 - 所以任何想法/帮助都非常受欢迎! < / p>

1 个答案:

答案 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);