ページ

2009年12月25日金曜日

NSView の表示順序と setWantsLayer:

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

(layer-backed view の覚え書き)

NSView が複数のサブビューを持っている場合、後から追加したものが上に表示される。ところがサブビューの一つが -[NSView setWantsLayer:YES] を呼んで CoreAnimation layer を使う宣言をすると、追加順序が無視されて一番上に表示される。

Mac Dev Center: NSView Class Reference


以下、SimpleCap での例



サブビューの追加順序からすると右のボタンの方が上に表示されるのだが、左の画像を表示しているビューは -[setWantsLayer:YES]を呼んでいるために上に表示されてしまった。SimpleCapの場合、画像の載っているビューは CoreAnimationのトランジションを使う為に layer-backed view にしてある。

これを解決するには右のボタンを表示するビューも -[setWantsLayer:YES] を使ってlayer-backed view にすれば良い。



- - - -
なお -[setWantsLayer:YES] を使うとそのビューでの -[NSView convertPointFromBase:] の挙動が変わる。イベントから取得したウィンドウ内の座標をビューのローカル座標に変換するには -[NSView convertPoint:FromView:] を使う。これで少々ハマってしまった。。