20

我正在创建一个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];     
}

红色只是举例。如果我向矩形添加子视图,则不会剪裁角: 在此处输入图像描述

我怎样才能做到这一点?

4

3 回答 3

33

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

在您的容器 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;
}
于 2011-10-06T15:02:10.290 回答
24

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

在此处输入图像描述

于 2016-12-06T11:58:37.457 回答
0

您是否尝试过使用图层进行剪辑?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


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

于 2011-02-23T10:40:07.737 回答