現在のTinyViewは、写真のポートレイトの様な形で画像表示を行っています(fig.01)。
[fig.01] 現在のTinyViewの画像表示はポートレイト |
これはこれで可愛いのですが、画像表示ソフトは、画像をウィンドウ一杯に表示し、はみ出した部分はスクロールバーを操作することによって見れるようにするのが普通です(必ずしもそうではありませんが、このタイプが一番多いでしょう)。そこで、今回から数回に分けて、画像表示に手を入れ、スクロールバー付きの表示を実現して行くことにします。
今まで、画像の表示はNSImageViewにまかせていました。そのままNSImageViewにまかせておいても、スクロールバーの付いたウィンドウを実現することは出来ますが、細かい制御がし辛いですし、新しいことを覚えるためにも、ここは自分で描画部分を組んでみましょう。いつもの様にTinyView.pbproj(もしくはTinyView.xcode)を開いて下さい。そして、MainMenu.nibをダブルクリックして、Interface Builderを開いて下さい。まずは、今まで使っていたNSImageViewを削除し、NSViewに入れ替えます。デザインウィンドウでNSImageViewを選択し、削除して下さい(fig.02)。
[fig.02] NSImageViewを削除 |
削除したら、ツールパレットからNSView(CustomViewと書いてあるのがそうです。)をデザインウィンドウにドラッグ&ドロップして下さい(fig.03)。
[fig.03] CustomViewをデザインウィンドウにドラッグ&ドロップ |
ドラッグ&ドロップしたら、ガイドに合わせて配置して下さい(fig.04)。
[fig.04] ガイド(点線)に合わせて配置する |
配置したら、先ほどNSImageViewを削除した時に切れてしまったOutletをつなぎ直しましょう(fig.05)。
[fig.05] File's OwnerのOutletにCustomViewを接続 |
つなぎ方の詳細は、第9回で説明していますので、忘れてしまった方は、そちらを参照して下さい。
さて、これで今までNSImageViewクラスのインスタンスがあった位置に、NSViewクラスのインスタンスが配置されました。ここでNSViewのリファレンスを見て下さい。一番最初に NSView is an abstract class that defines the basic drawing, と書いてあります。つまり、NSViewは抽象クラスですから、これだけでは何も出来ません。必ず継承して、必要なメソッドをオーバライドする必要があります。では、これを行うためにProject Builder(もしくはXcode)に戻って下さい。「グループとファイル」の中から「Classes」グループを選び、ファイルメニューから「新規ファイル...」を選んで下さい(fig.06)。
[fig.06] Classesグループを選んでからファイルメニューの「新規ファイル...」を選択 |
なお、「Classes」グループを選ぶのは、この中にファイルが出来て欲しいからです。これをやらずに、他の場所にファイルが出来てしまっても、ドラッグして移動すれば、別に問題ありません。「新規ファイル...」を選ぶと、アシスタントパネルが現れます。今回は、NSViewのサブクラスを作成しますので、「Objective-C NSView subclass」を選んで下さい(fig.07)。
[fig.07] Objective-C NSView subclassを選んで、次へ |
選んだら、「次へ」ボタンを押します。すると、ファイル名を入れる画面になりますので、「MyImageView.m」というファイル名を入れて下さい(fig.08)。
[fig.08] ファイル名を入れて、ターゲットを確認する |
この時、現在使用しているターゲットにチェックが入っていることを確認し、入っていなかったら入れて下さい(通常は確認しなくても入っているはずですが、第26回で従来のターゲットをXcodeネイティブに変換し、ターゲットが二つある場合は、入っていない可能性があります。この場合は、ビルドするのがどちらのターゲットなのかも、意識する必要があります。)。以上のことを行ったら、「完了」ボタンを押して下さい。MyImageView.hとMyImageView.mの二つのファイルが生成されます(fig.09)。
[fig.09] 二つのファイルが生成される |
中身を見てみましょう。MyImageView.mは、以下の様になっているはずです。
#import "MyImageView.h" @implementation MyImageView - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code here. } return self; } - (void)drawRect:(NSRect)rect { // Drawing code here. } @end
コメントを読めば分かりますが、Drawing code here.と書いてある所で描画を行えば良いわけです。この続きは次回です。