我试图创建一个自定义的NSWindow,所以我已经创建了一个带有适当的无边界窗口蒙版的模板,并且可以正常工作。我提供自己的内容 View ,这很好。但是我想做的是绘制带有圆角的图像,将 subview 剪辑到那些角。这可能吗?

在我的内容 View 中,我可以覆盖drawRect:并绘制带有圆角的路径,但是当我向其添加 subview 时,它们不会被剪切。

相反,我可以使内容 View 具有图层支持,并为其设置一个圆角半径(masksToBounds设置为YES),但是当我添加 subview 时,它们仍然不会被我的圆角所限制。

有没有办法做到这一点?或者以某种方式绘制不带标题栏的NSWindow,而我可以完全控制该绘制,但仍保持圆角,剪切角?

最佳答案

我能够做的是提供我的NSWindow的自定义子类:

@implementation ELGRoundWindow

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag
{
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag];

    if ( self )
    {
        [self setStyleMask:NSBorderlessWindowMask];
        [self setOpaque:NO];
        [self setBackgroundColor:[NSColor clearColor]];
    }

    return self;
}


- (void) setContentView:(NSView *)aView
{
    aView.wantsLayer            = YES;
    aView.layer.frame           = aView.frame;
    aView.layer.cornerRadius    = 20.0;
    aView.layer.masksToBounds   = YES;


    [super setContentView:aView];

}

@end

然后在IB中,我将内容 View 的类更改为ELGRoundView:
@implementation ELGRoundView

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor colorWithCalibratedRed:0.0 green:0.5 blue:1 alpha:1] set];
    NSRectFill(dirtyRect);
}

@end

我在内容 View 中放置了另一个正方形 subview ,内容如下:
@implementation ELGSquareView

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor colorWithCalibratedRed:0.0 green:0 blue:1 alpha:1] set];
    NSRectFill(dirtyRect);
}

@end

我最终得到了:

关于cocoa - 具有圆角的自定义NSWindow可以剪切 subview ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15179288/

10-13 09:21