【问题标题】:NSTableView with rounded corners带圆角的 NSTableView
【发布时间】:2012-12-13 04:13:40
【问题描述】:

我正在尝试自定义我的应用程序的 UI,并且我希望我的 NSTableView 具有圆角。所以我继承了 NSTableView 并得到了这个:

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

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

编辑:

我在 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 方法中绘制的。有趣的是,这确实剪辑了第一行和最后一行的选择:

但不是在表格滚动时:

所以问题仍然存在:如何将所有绘图剪辑到 NSScrollView 的圆角框架内?

【问题讨论】:

  • 你会发布你的剪辑代码吗?
  • 您是否覆盖了drawRectinitWithRect
  • @FireLizzard 我会在 initWithRect 方法中添加什么?我在上面的 NSTableView 中发布了我的 drawRect 方法。框架的实际绘制发生在 NSScrollView 的 drawRect 方法中。
  • 我对 NSView 的子类化了解不多。您可能不必覆盖initWithRect,我只是把它放在那里作为一种可能性。我想知道您的问题是否与您在剪辑后致电[super drawRect:] 的事实有关。只是想法。

标签: macos cocoa nstableview rounded-corners


【解决方案1】:

我发现你可以在表格视图的容器滚动视图上调用这个。

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

这就是我所需要的,而且它有效。不需要子类化。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2011-04-05
      • 2020-12-30
      • 2019-05-19
      • 1970-01-01
      相关资源
      最近更新 更多