NSView で半透明な塗りつぶしを描きたい。
こんなやつ。
サンプルを作ってみた。
検証のためいろいろ盛ってあるが、左の黒い半透明なのが目的の NSView(のサブクラス)。
NSViewのサブクラスを作って普通に描画すると半透明にならない。
- (void)drawRect:(NSRect)dirtyRect {
[[NSColor colorWithDeviceWhite:0.0 alpha:0.75] set];
NSRectFill(dirtyRect);
}
NSView を半透明にするには Compsiting Operation を変えてやる必要がある。塗りつぶしの場合は NSRectFillUsingOperation を使うといい。
- (void)drawRect:(NSRect)dirtyRect {
[[NSColor colorWithDeviceWhite:0.0 alpha:0.75] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}
すると半透明になる。もっと一般的な描画(NSBezierPathなど)には -[NSGracphigContext setCompositingOperation:] を使い設定する。
Compositing Operation については下記のドキュメントで解説されている。
NSGraphicsContext Class Reference
ここによるとデフォルトは NSCompositSourceOver になっているとのことだが NSRectFill はそうなっていない。
Cocoa Drawing Guide: Graphics Contexts
- - - -
半透明ビュー下のテキストボックスやボタンはそのままだと反応してしまう。マウスイベントは mouseDown: を拾えばいいのだが、キー入力はどうやって遮断するのか。