使用-setClip方法在自定义视图上重新绘制插入NSShadow



我有一个奇怪的问题,与这个问题的答案有关:

绘制一个Inset NSShadow和Inset Stroke

我将这段代码用于自定义视图的drawRect方法。我有这个:

- (void)drawRect:(NSRect)rect
{   
    // Create and fill the shown path
    NSBezierPath *path = [NSBezierPath 
                          bezierPathWithRoundedRect:[self bounds] 
                          xRadius:4.0f 
                          yRadius:4.0f];
    [[NSColor colorWithCalibratedWhite:0.8f alpha:0.2f] set];
    [path fill];
    // Save the graphics state for shadow
    [NSGraphicsContext saveGraphicsState];
    // Set the shown path as the clip
    [path setClip];
    // Create and stroke the shadow
    NSShadow * shadow = [[[NSShadow alloc] init] autorelease];
    [shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0f alpha:0.8f]];
    [shadow setShadowBlurRadius:2.0];
    [shadow set];
    [path stroke];
    // Restore the graphics state
    [NSGraphicsContext restoreGraphicsState];
    if ( highlight && [[self window] firstResponder] == self ) {
        NSSetFocusRingStyle(NSFocusRingOnly);
        [[NSBezierPath bezierPathWithRect:[self bounds]] fill];
    }
}

当我添加Multiline Label(我的自定义视图的兄弟或子)时,问题就出现了。

当我的程序窗口失去焦点,我回到它,我的内部阴影/描边变暗。阴影似乎是重叠的。这很奇怪,因为如前所述,如果我的窗口只有这个自定义视图,它会运行良好。

如果我注释

[path setClip]; 

阴影不再叠加了,但是我没有得到想要的圆角效果(类似于NSBox)。

我尝试了用按钮而不是多行标签发生的事情,并且通过失去/获得窗口焦点它没有问题,但是当我单击按钮时阴影会叠加。

我发现问题是类似于这里,但在Cocoa而不是Java:

Java setClip似乎重新绘制

谢谢你的帮助!

你不应该使用-setClip,除非你知道你在做什么。您应该使用-addClip,它尊重现有的剪切路径。

相关内容

  • 没有找到相关文章

最新更新