12

丸みを帯びた角とドロップ シャドウの両方を持つカスタム NSView を作成しようとしています。私は NSView サブクラスを作成し、次の drawRect: メソッドを持っています。

- (void)drawRect:(NSRect)dirtyRect
{
    NSRect rect = NSMakeRect([self bounds].origin.x + 3, [self bounds].origin.y + 3, [self bounds].size.width - 6, [self bounds].size.height - 6);

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:5.0 yRadius:5.0];
    [path addClip];

    NSShadow *shadow = [[[NSShadow alloc] init] autorelease];
    [shadow setShadowColor:[NSColor redColor]];
    [shadow setShadowBlurRadius:2.0f];
    [shadow setShadowOffset:NSMakeSize(0.f, -1.f)];
    [shadow set];

    [[NSColor controlColor] set];
    NSRectFill(rect);

    [super drawRect:dirtyRect];
}

結果は、丸みを帯びた角で描画された NSView ですが、影はありません (ただし、アンチエイリアシングで角の周りに赤い色が見えます)。NSBezierPath をコメントアウトすると、影のある正方形の NSView が得られます。NSShadow と NSBezierPath が相互に排他的であることを示唆するドキュメントは見当たりませんでした。そのため、明らかに何かが欠けています。

どんなアイデアでも大歓迎です!

4

2 に答える 2

5

影がクリッピングパスを尊重していないようです。[path fill]代わりに試しましたNSFillRectか?

于 2011-04-28T20:24:58.720 に答える
0

CALayerのcornerRadiusメソッドを使用して、丸みを帯びたコーナー効果を得ることができます。

于 2011-04-28T20:26:39.787 に答える