带圆角的NSTableView

3
我正在尝试自定义应用程序的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的圆形框架内?

你能否发布一下你的剪切代码? - paulmelnikow
你重写了 drawRectinitWithRect 吗? - Ethan Reesor
@FireLizzard,initWithRect方法中我应该放什么?我在上面的NSTableView中发布了我的drawRect方法。实际的框架绘制发生在NSScrollView的drawRect方法中。 - danjonweb
我对子类化NSView的了解不是很多。你可能不需要覆盖initWithRect,我只是提出这个可能性。我想知道你的问题是否与在剪辑后调用[super drawRect:]有关。这只是一些想法。 - Ethan Reesor
2个回答

6
我发现你可以在表视图的容器滚动视图上调用这个方法。
self.scrollView.wantsLayer = TRUE;
self.scrollView.layer.cornerRadius = 6;

这就是我需要的,它能够正常工作。无需创建子类。

3

我能够使用CALayer很好地解决这个问题。在尝试从NSScrollView到NSTableView再到NSClipView的所有子类化后,仍然出现了上面显示的渲染问题,最终我只需将以下代码添加到NSScrollView子类的drawRect中:

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

然后我在NSScrollView的drawRect方法中绘制了框架。这解决了以上所有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接