記事一覧

Adding subview to NSImageView

NSImageViewにサブビューを追加する

※今回から英語も併記することにしました(余裕があるときだけ;)

Interface Builder で UI を作ってるんですが、背景画像の上に各種部品を配置しようと思ったら、背景画像がすべてを覆い隠してしまって全くダメダメに。
なんでや!?と思って調べたら、同列の subview 同士の重ね順の概念自体が無く、Interface Builder 上で指定した重ね順というのは単なる編集上の便利機能にすぎない。
Subview 同士を重ねてしまった場合の挙動は定義されていないのでどう重ね順がどうなるかはその時々で変わってしまう、とのこと。

で、解決策のヒントになったのがこれ。
http://stackoverflow.com/questions/2415561/apple-interface-builder-adding-subview-to-uiimageview
あくまで iPhone OS の方ですが、同じようにやってみたら成功しました。

(1)まず背景用として NSImageView じゃなくて NSView を配置
(2)オブジェクトビュー画面で各種部品を NSView の傘下に入れる
(3)インスペクタで NSView のクラスを NSImageView に変更
(4)ビューコントローラのヘッダファイルにアウトレットを追加
 (IBOutlet) NSImageView * anImageView;
(5)Interface Builder上でこれとさっき配置したビューをコネクト
(6)ビューコントローラの .m ファイルの setAU に
 [anImageView setImage:....]
 でイメージを追加


From this topic I'm going to add English version of each issue, too.

I'm now building the custom view for my Magical 8bit Plug by Interface Builder, and what I want to do right now is
to put my UI parts on my custom background image.
It looks nice on Interface Builder, but compile and run it to have found the background image covers all other parts and nothing works.

I wonder why and google'd a bit to have found that
there's no concept of layering order between "sibling" subviews (subviews belong to the same parent view),
so you cannot tell the order of the layered subviews before running it.

I've got the hint to solve this problem from here:
http://stackoverflow.com/questions/2415561/apple-interface-builder-adding-subview-to-uiimageview

It's an iPhone issue, not Cocoa, but it worked as well.

(1)Put NSView, not NSImageView, for background image container. Do not put image here.
(2)On Object View Window move your UI parts under NSView to make them be children of NSView.
(3)Change the Class of NSView to NSImageView by Inspector.
(4)Add the declaration of the outlet on your ViewController's header file.
 (IBOutlet) NSImageView * anImageView;
(5)On Interface Builder connect this outlet to the view you put on (1).
(6)add your background image by invoking setImage in the setAU selector of your ViewController's .m file.
 [anImageView setImage:....]