如果在NSView上边缘被舍入,则不会出现阴影

时间:2012-01-05 11:28:22

标签: cocoa nsview rounding dropshadow

我正在尝试使用以下代码从一个NSView派生类中舍入和删除阴影:

   [graphHostView setWantsLayer:YES];


    graphHostView.layer.shadowRadius = 5.0;
    graphHostView.layer.shadowOffset = NSMakeSize(10.0f, -10.0f);
    graphHostView.layer.shadowOpacity = 0.5f;


    graphHostView.layer.needsDisplayOnBoundsChange = YES;
    graphHostView.layer.masksToBounds = YES;    
    graphHostView.layer.cornerRadius = 10.0;
    [graphHostView.layer setNeedsLayout];

只有在没有舍入的情况下,阴影才会起作用,如果舍入是第一个还是第二个,则无关紧要。我也可以通过代码间接地从视图中删除阴影:

NSShadow * myShadow = [[NSShadow alloc] init]; [myShadow setShadowOffset:NSMakeSize(10.0f,-10.0f)]; [myShadow setShadowBlurRadius:3.0]; [graphHostView setShadow:myShadow]; [myShadow set];

具有完全相同的效果。我已经尝试了display,setNeedsLayout和其他属性和方法的所有组合,但没有任何效果。

对我而言,这似乎令人难以置信,毕竟这不起作用,NSWindow是圆形和阴影......

提醒我必须补充说我已尝试在背衬层上应用阴影,结果相同。 由于maskToBounds预计会掩盖边界之外的任何东西,因此可以合理地相信阴影不能显示在同一层上。 同样清楚的是,掩蔽对掩蔽之后可以添加到该层的任何事物都有影响,因为设置阴影和掩模的顺序对结果没有影响。

所以,问题仍然是,如果可能的话,如何在没有用阴影驱动另一个NSView的情况下实现想要的结果?

2 个答案:

答案 0 :(得分:1)

这对我来说(在Swift中):

graphHostView.layer.masksToBounds = false

答案 1 :(得分:-2)

你需要:

[[graphHostView superview] setWantsLayer:YES];