在透明窗口中舍入NSView

时间:2013-02-21 16:38:49

标签: objective-c cocoa nsview nswindow

我正试图在那里制作一个透明的NSWindow。

我正在尝试使用透明窗口绘制圆角视图。

这就是现在的样子:(见角落里的小点)

enter image description here

这是边框半径设置为10px的另一个示例(在NSView drawRect中设置):

enter image description here

我正在使用此Apple示例中的代码:https://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html

具体在我的NSWindow子类中的这个方法:

- (id)initWithContentRect:(NSRect)contentRect
                styleMask:(NSUInteger)aStyle
                  backing:(NSBackingStoreType)bufferingType
                    defer:(BOOL)flag {
    // Using NSBorderlessWindowMask results in a window without a title bar.
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
    if (self != nil) {
        // Start with no transparency for all drawing into the window
        [self setAlphaValue:1.0];
        // Turn off opacity so that the parts of the window that are not drawn into are transparent.
        [self setOpaque:NO];
    [self setBackgroundColor:[NSColor clearColor]];

    }
    return self;
}

这在我的NSView子类中:

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor redColor] set];
    NSBezierPath* thePath = [NSBezierPath bezierPath];
    [thePath appendBezierPathWithRoundedRect:dirtyRect xRadius:3 yRadius:3];
    [thePath fill];
}

谁能告诉我这里缺少什么?

感谢。

2 个答案:

答案 0 :(得分:3)

不确定这是否是您正在寻找的东西,但Matt Gemmell有一个名为MAAttachedWindow的优秀课程,可以在这里找到:http://mattgemmell.com/2007/10/03/maattachedwindow-nswindow-subclass/

虽然我需要做一个“浮动”弹出窗口并配置透明度,边框半径,如果需要,甚至可以为上下文添加一个小箭头,但它仍然适合我。我一直都在使用它。

答案 1 :(得分:3)

您是否正在寻找以下内容,其中有红色轮廓(笔划),但中心区域是透明的?

enter image description here

如果是这样,为了达到这个目的,我使用了以下代码:

- (void)drawRect:(NSRect)frame {
    frame = NSInsetRect(self.frame, 3.0, 3.0);

    [NSBezierPath setDefaultLineWidth:6.0];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:frame
                                             xRadius:6.0 yRadius:6.0];
    [[NSColor redColor] set];
    [path stroke];
}

如果您正在寻找,那么您可以将其作为起点。你需要确保将frame矩形插入笔划线宽的一半,以避免像你看到的那样剪裁角落的问题。