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

con*_*are 15 cocoa clipping rounded-corners nsview 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];     
}
Run Code Online (Sandbox Code Playgroud)

红色就是例如.如果我在矩形中添加子视图,则角落不会被剪裁: 在此输入图像描述

我怎样才能做到这一点?

Jas*_*wig 31

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

在您的容器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;
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:这不适用于对NSScrollView的角进行舍入的特殊情况,该文档视图的大小超过NSScrollView的边界(一旦文档边界发生更改,它似乎会重置图层剪切路径).但是,如果文档视图的静态大小小于或等于滚动视图大小,它将起作用. (3认同)
  • 在调用self.wantsLayer = YES之前; 你需要设置图层:self.layer = layer; http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/doc/uid/20000014-SW61 (2认同)

Tib*_*abo 17

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

在此输入图像描述


小智 0

您尝试过用图层进行剪辑吗?

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


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