2011-04-28 158 views
11

我想創建一個自定義NSView與圓角和陰影。我創建了一個的NSView子類,並具有以下drawRect:方法自定義NSView與圓角和陰影

- (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是互斥的,所以我顯然錯過了一些東西。

任何想法,非常感謝!

回答

5

它看起來像陰影不尊重剪切路徑。你試過[path fill]而不是NSFillRect

+0

我把[路徑填充]放在NSFillRect()的地方,結果是一樣的 – 2011-04-28 20:32:46

+0

只是爲了防止任何人讀這個[路徑填充]爲我繪製一個圓角拐角內drawRect – 2011-08-09 16:31:55

0

您可以使用CALayer的cornerRadius方法來獲得圓角效果。

+1

我不是完全確定我是否正確使用了CALayer,但是我在initWithFrame中添加了以下內容: '[self setWantsLayer:YES];' '[self setLayer:[CALayer layer]];' 'self.layer.cornerRadius = 5.0;'這似乎沒有任何影響。 – 2011-04-28 20:33:40

+0

你可以再試一次,但在另外兩行之後放置'[self setWantsLayer:YES];''。 – David 2011-04-28 21:17:58

+0

嘗試交換行 - 仍然是相同的結果 – 2011-04-29 03:05:25