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 はホント良くできてる。