我试图创建一个自定义的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/