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

質問に答える前にいくつかのメモ:

  • バニラsuperで の実装を呼び出す必要はありません。デフォルトの実装は何もしません。drawRect:NSView
  • [self bounds]ではなく、塗りつぶし長方形として使用する必要がありますdirtyRect。このdirtyRectパラメーターは、描画が必要なビューの部分を示すために使用され、描画の最適化のみに使用されます。
  • オブジェクトをリークしていdropShadowます。autorelease作成後に呼び出すか、を呼び出しreleaseた後に呼び出す必要がありますsetShadow:

影が表示されない理由は 2 つあります。まず、レイヤーに基づくビューで影を表示するには、ビューのスーパービューもレイヤーに基づく必要があります。

次に、影の色を設定していますが、他のパラメーターは設定していません。

- (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 に答える