带圆角的NSTableView

时间:2012-12-13 04:13:41

标签: macos cocoa nstableview rounded-corners

我正在尝试自定义应用程序的UI,我希望我的NSTableView有圆角。所以我将NSTableView子类化并得到了这个:

Imgur

但是,当我填充表并选择一行时,选择将在边框上绘制,如下所示:

Imgur

我尝试在表格视图绘图代码中添加剪辑,但它不起作用。关于我如何解决这个问题的任何建议?

修改

我在NSTableView中的绘图代码如下:

- (void)drawRect:(NSRect)dirtyRect {
    [NSGraphicsContext saveGraphicsState];
    NSRect frame = NSMakeRect(0.0, 0.0, [self bounds].size.width, [self bounds].size.height-1.0);
    [[NSBezierPath bezierPathWithRoundedRect:frame xRadius:3.6 yRadius:3.6] addClip];
    [super drawRect:dirtyRect];
    [NSGraphicsContext restoreGraphicsState];
}

实际的圆形框架在NSScrollView drawRect方法中绘制。有趣的是,它确实剪切了第一行和最后一行的选择:

Imgur

但不是在表格滚动时:

Imgur

所以问题仍然存在:如何在NSScrollView的圆形框架内剪切所有绘图?

2 个答案:

答案 0 :(得分:4)

我发现你可以在表视图的容器滚动视图中调用它。

self.scrollView.wantsLayer = TRUE;
self.scrollView.layer.cornerRadius = 6;

这就是我需要的全部功能。不需要子类化。

答案 1 :(得分:3)

我能够使用CALayer很好地解决这个问题。在尝试将所有内容从NSScrollView子类化到NSTableView到NSClipView之后,仍然得到上面显示的渲染问题之后,我最终只是将此代码添加到NSScrollView子类的drawRect中:

if (!self.contentView.wantsLayer) {
    [self.contentView setWantsLayer:YES];
    [self.contentView.layer setCornerRadius:4.0f];
}

然后我在NSScrollView的同一个drawRect方法中绘制框架。它解决了上述所有问题。

相关问题