2007.12.20 Thursday
Leopard NSMenuで変わった点
|
今週の日曜日にCocoa勉強会があって、久しぶりに発表した。
(というか、このブログも久しぶり) 発表した内容は、私の得意ジャンルのメニュー関係。 Leopardで新しくなったNSMenuとNSMenuItemの差分の解説を行った。 メニュー自体は、はっきり言ってOSX10.0の頃からほとんどといっていいほど変わってない部分ではある。なぜなら、いまだにほとんどの部分をCarbonが補っていて、Cocoaからいじれる部分があまりなかったという所にある。 わかりやすく言えば、ラベルメニューやボリュームメニューのようなコントローラーを装備しているメニューをCocoaで作る事は出来なかったのだ! しかし、Leopardではそれが解禁になった。といってもベースはCarbonなんだけど、NSMenuItemにNSViewを張る事が可能になったのだ。 具体的には以下のAPIになる… NSMenuItem - (void)setView:(NSView *)view; - (NSView *)view; これで、自分の作ったカスタムViewをメニューアイテムに貼るだけで、簡単にコントローラー付きのメニューが作れてしまう。Carbon時代でも、コントローラ付きメニューを作るには膨大なソースを書かなくてはいけなかったんだけど、これでほぼInterfaceBuilberだけで出来てしまうという簡単さになったわけだ。 これは、ある意味革命である。(^_^; さて、NSViewが使えるとなると、NSViewのwindow API を利用する事で、メニュー自体の操作まで可能になる。これは、いろいろな使い道が出来そうだ… というわけで、勉強会で発表した応用編のメニューを2つ紹介。 まず最初は、メニュー内のViewに画僧を配置させ、さらにアニメーションまでさせてしまおう、というサンプル。実際ちょっと同期に癖があるが、その辺をうまくすればこのように、アニメするメニューまで作れてしまう(^_^; 次に、取り外し可能メニュー。 これは、メニューウインドウのマウスイベントをハックして、そのまま取り外してしまおうという試み。 古い方なら覚えているかも知れないが、OS9時代のメニューでは、実際このような取り外しメニューが可能だった(ハイパーカードのパレットメニューのような…)。 じゃ、それを実際やってみようと、いろいろやってみた所出来た(笑) ドラッグした先で、パネルウインドウを表示させているだけだけど、まさに取り外したような感じに見える。 と、Leopardではメニューに関しては、Viewは貼れるという事で、Cocoaプログラマーにとってはかなり自由度の増したAPIになったと思うので、今後の応用に期待したい〜 |
||



![たのしいCocoaプログラミング[Leopard対応版]](http://ecx.images-amazon.com/images/I/31jKj%2BBWJIL._SL160_.jpg)
