我正在尝试为自定义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:
的所有必要要求?
答案 0 :(得分:19)
在回答问题之前的几点说明:
super
上调用drawRect:
NSView
的{{1}}。默认实现什么都不做。 [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;
}