jbr*_*nan 8 cocoa calayer nswindow
我正在尝试创建一个自定义NSWindow
,所以我用一个合适的无边框窗口掩码创建了一个自定义.我提供自己的内容视图很好.但我想要做的是绘制圆角,也可以将子视图剪切到那些角落.这可能吗?
在我的内容视图中,我可以覆盖drawRect:
并绘制带圆角的路径,但是当我向其添加子视图时,它们不会被剪裁.
我可以改为使我的内容视图支持图层并给它一个角半径(masksToBounds
设置为YES
)但是当我添加子视图时,它们仍然没有被我的圆角修剪.
有没有办法做到这一点?或者某种方式来绘制一个没有标题栏的NSWindow并且我可以完全控制绘图,并保持圆形的剪裁角落?
eri*_*icg 12
我能做的是提供我的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
Run Code Online (Sandbox Code Playgroud)
然后在IB中,我将我的内容视图的类更改为ELGRoundView:
@implementation ELGRoundView
- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor colorWithCalibratedRed:0.0 green:0.5 blue:1 alpha:1] set];
NSRectFill(dirtyRect);
}
@end
Run Code Online (Sandbox Code Playgroud)
我在内容视图中放置了另一个方形子视图,其中包含以下内容:
@implementation ELGSquareView
- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor colorWithCalibratedRed:0.0 green:0 blue:1 alpha:1] set];
NSRectFill(dirtyRect);
}
@end
Run Code Online (Sandbox Code Playgroud)
我结束了:
@ericgorr的建议是正确的.此外,如果您希望窗口可移动并可调整大小,请更改NSWindow的init,如下所示,
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(NSUInteger)aStyle
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
{
self = [super initWithContentRect:contentRect
styleMask:aStyle
backing:bufferingType
defer:flag];
if (self) {
[self setOpaque:NO];
[self setBackgroundColor:[NSColor clearColor]];
[self setMovableByWindowBackground:YES];
[self setStyleMask:NSResizableWindowMask];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
有关进一步的自定义,请参阅Apple示例代码 http://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html