使用setShadow的NSView投影:

Pat*_*ini 3 cocoa core-animation objective-c 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];
}
Run Code Online (Sandbox Code Playgroud)

它只渲染一个蓝色方块(即没有阴影).

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

Rob*_*ger 19

在回答问题之前的一些注意事项:

  • 你不需要在香草上调用它super的实现.默认实现什么都不做.drawRect:NSView
  • 你应该[self bounds]用作填充矩形,而不是dirtyRect.该dirtyRect参数用于指示需要绘制的视图部分,仅用于绘图优化.
  • 你正在泄漏这个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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有使用ARC(自动引用计数)编译pcperini方法的文件,则dropShadow的"泄漏"只是"泄漏".此时ARC是常用的,并且在启用ARC时调用release或autorelease将导致编译错误. (5认同)