可可:用圆角底角掩盖 NSTableView

Posted

技术标签:

【中文标题】可可:用圆角底角掩盖 NSTableView【英文标题】:Cocoa: Masking NSTableView with rounded bottom corners 【发布时间】:2014-06-20 23:16:24 【问题描述】:

我试图弄清楚如何用底部圆角遮盖 NSTableView - 但仅限于底部。

在此图像中,未应用任何效果:

在这些图像中,您可以看到圆角,我使用以下代码来处理角:

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

我想不通的是如何去掉左上角和右上角的圆角:

我尝试了几个不同的选项都无济于事:

//creating a path
//this is a category from github.com/iccir/XUIKit
NSBezierPath * path = [NSBezierPath bezierPathWithRoundedRect:self.tableView.bounds byRoundingCorners:XUIRectCornerBottomLeft|XUIRectCornerBottomRight cornerRadii:CGSizeMake(6, 6)];
CAShapeLayer * layer = [CAShapeLayer layer];
layer.fillColor = [[NSColor blackColor] CGColor];
layer.path = [path CGPath];

//attempt 1
self.scrollView.contentView.wantsLayer = TRUE;
self.scrollView.contentView.layer.mask = layer;
self.scrollView.contentView.layer.masksToBounds = TRUE;

//attempt 2
((NSView*)self.scrollView.documentView).wantsLayer = TRUE;
((NSView*)self.scrollView.documentView).layer.mask = layer;
((NSView*)self.scrollView.documentView).layer.masksToBounds = TRUE;

//attempt 3
self.scrollView.wantsLayer = TRUE;
self.scrollView.layer.mask = layer;
self.scrollView.layer.masksToBounds = TRUE;

最终发生的事情是一切都消失了:

有人知道如何正确处理这个问题吗?谢谢!

【问题讨论】:

滚动视图的父视图是什么?你试过把它的底角弄圆吗?它应该剪辑它包含的任何内容。 【参考方案1】:

我想通了。此代码有效:

//creating a path
//github.com/iccir/XUIKit
NSBezierPath * path = [NSBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,325,80) byRoundingCorners:XUIRectCornerBottomLeft|XUIRectCornerBottomRight cornerRadii:CGSizeMake(6, 6)];
CAShapeLayer * layer = [CAShapeLayer layer];
layer.path = [path CGPath];
self.scrollView.wantsLayer = TRUE;
self.scrollView.layer.mask = layer;

我的问题是我最初创建的路径的 .height 为 0。

还要注意,如果表格视图改变大小,图层蒙版也必须改变。

【讨论】:

osx没有这个API“bezierPathWithRoundedRect: byRoundingCorners”,你怎么用? @jimwan 在我的代码 cmets 中,我指向 XUIKit - github.com/iccir/XUIKit

以上是关于可可:用圆角底角掩盖 NSTableView的主要内容,如果未能解决你的问题,请参考以下文章

如何制作具有圆角顶角和方形底角的 UIView

WKInterfaceGroup 底角半径

可可绘制带圆角和阴影的图像

将形状设置为 ImageView 背景以获得圆角

用 CAShapeLayer 添加阴影?

仅底部带有圆角的 WPF 弹出窗口