3

我正在尝试为自定义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:

4

1 回答 1

19

回答问题前的几点说明:

  • 你不需要在 vanilla 上调用super' 的实现。默认实现什么也不做。drawRect:NSView
  • 您应该[self bounds]用作填充矩形,而不是dirtyRect. 该dirtyRect参数用于表示视图中需要绘制的部分,仅用于绘制优化。
  • 您正在泄漏dropShadow对象。您应该autorelease在创建release后调用它,或者在调用setShadow:.

阴影不显示的原因是双重的。首先,为了让 layer-backed 视图显示阴影,view 的 superview 也必须是 layer-backed。

其次,您正在设置阴影的颜色,但没有设置其他参数:

- (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;
}
于 2012-01-29T03:49:25.750 回答