ページ

2008年3月31日月曜日

RoundRect と NSShadow

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

NSShadowの使い方が分かったので RoundRect と組み合わせてみた。

まず表示から。問題なし。


次にファイル書き出し。こちらも問題なし。


ソース:RoundRect-4


と、まあ簡単に実現できたのだけれど、コードはちょっとダサいかもしれない。。

表示の方のコード。

- (void)drawRect:(NSRect)rect {
// Drawing code here.
[NSGraphicsContext saveGraphicsState];
NSShadow* shadow = [[NSShadow alloc] init];
[shadow setShadowOffset:NSMakeSize(10.0, -10.0)];
[shadow setShadowBlurRadius:3.0];
[shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.3]];
[shadow set];
[[NSColor whiteColor] set];
[_clip_path fill];
[NSGraphicsContext restoreGraphicsState];

[NSGraphicsContext saveGraphicsState];
[_clip_path setClip];
[self lockFocus];
[_image drawInRect:NSMakeRect(50, 50, 440-50, 320-50)
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:1.0];
[self unlockFocus];
[NSGraphicsContext restoreGraphicsState];
}


以前の RoundRect のコードの前半に影を描画するコードを追加してある。クリッピングで使う RoundRectのパスを使い白色で塗りつぶしている。この行為により影が描かれる。その後、画像で上書きしている。なお数値の50は NSView内に影が表示できるようにサイズ調整している。


次は保存コード。こちらも同じ方法。ポイントだけ抜粋する。
 [rimg lockFocus];
[NSGraphicsContext saveGraphicsState];
NSShadow* shadow = [[NSShadow alloc] init];
[shadow setShadowOffset:NSMakeSize(10.0, -10.0)];
[shadow setShadowBlurRadius:3.0];
[shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.3]];
[shadow set];
[[NSColor whiteColor] set];
[round fill];
[NSGraphicsContext restoreGraphicsState];

[round setClip];
[_image compositeToPoint:NSMakePoint(25, 25) operation:NSCompositeSourceOver];
[rimg unlockFocus];


- - - -
画像の四隅を丸くし、影を付けることができた。どちらも専用のクラスが用意されているので簡単だった。cocoa はホント良くできてる。