使用setShadow的NSView投影:

时间:2012-01-29 03:32:53

标签: objective-c cocoa core-animation nsview dropshadow

我正在尝试为自定义NSView子类制作投影。

到目前为止,我已经成功了:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSShadow *dropShadow = [[NSShadow alloc] init];
        [dropShadow setShadowColor: [NSColor redColor]];

        [self setWantsLayer: YES];
        [self setShadow: dropShadow];
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor blueColor] setFill];
    NSRectFill(dirtyRect);

    [super drawRect: dirtyRect];
}

只渲染蓝色方块(即没有阴影)。

我是否在正确的位置设置投影? 我是否满足使用setShadow:的所有必要要求?

1 个答案:

答案 0 :(得分:19)

在回答问题之前的几点说明:

  • 您无需在super上调用drawRect: NSView的{​​{1}}。默认实现什么都不做。
  • 您应该使用[self bounds]作为填充矩形,而不是dirtyRectdirtyRect参数用于指示需要绘制的视图部分,仅用于绘图优化。
  • 您正在泄漏dropShadow对象。您应该在创建后致电autorelease,或在致电release后致电setShadow:

阴影未显示的原因有两个。首先,为了使图层支持的视图显示阴影,视图的超级视图也必须是图层支持的。

其次,您要设置阴影的颜色,而不是其他参数:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSShadow *dropShadow = [[NSShadow alloc] init];
        [dropShadow setShadowColor:[NSColor redColor]];
        [dropShadow setShadowOffset:NSMakeSize(0, -10.0)];
        [dropShadow setShadowBlurRadius:10.0];

        [self setWantsLayer: YES];
        [self setShadow: dropShadow];

        [dropShadow release];
    }

    return self;
}