NSView上的圆角矩形剪辑所有包含子视图

时间:2011-02-23 06:03:27

标签: cocoa nsview rounded-corners clipping nsbezierpath

我正在创建一个带圆角的NSView子类。此视图是一个容器,其他子视图将添加到其中。我试图让NSView的圆角也剪切掉所有子视图的角落,但是我无法得到它。

- (void)drawRect:(NSRect)dirtyRect {
    NSRect rect = [self bounds];
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius];
    [path addClip];

    [[NSColor redColor] set];
    NSRectFill(dirtyRect);

    [super drawRect:dirtyRect];     
}

红色就是例如。如果我在矩形中添加子视图,则角落不会被剪裁: enter image description here

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:30)

使用核心动画图层将正确剪辑子图层。

在您的容器NSView子类中:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.layer = _layer;   // strangely necessary
        self.wantsLayer = YES;
        self.layer.masksToBounds = YES;    
        self.layer.cornerRadius = 10.0;    
    }    
    return self;
}

答案 1 :(得分:15)

您可以在界面构建器中进行,而无需子类化添加用户定义的运行时属性“

enter image description here

答案 2 :(得分:0)

您是否尝试使用图层剪切?

<击> self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


啊,对不起,不知怎的,我错过了你在谈论NSView,而不是UIView。在所有情况下都很难剪辑NSView子视图,因为似乎大多数Cocoa标准视图都设置了自己的剪切路径。使用一些填充布局子视图可能更容易,并且避免需要裁剪。