Cocoaでいこう! Macらしく 第32回
Yoshiki(DreamField)
この記事は、MOSAが発行するデベロッパ向けのデジタルマガジンMOSADeN 第94号(2003年12月16日発行)に掲載された記事です。2〜3ヶ月遅れで、ここに掲載して行きます。

ウィンドウのサイズを調節しよう(中編)

前回はscrollViewのサイズの見積もりまで行いました。今回は、その結果を元にウィンドウのサイズを見積もり、それをウィンドウの最大サイズにします。windowControllerDidLoadNib:に、次の様にコードを追加して下さい。

- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
    NSWindow *theWindow;
    NSSize theScrollViewSize;
    NSRect theScrollViewRect, theWindowMaxRect;

    [super windowControllerDidLoadNib:aController];
    [ imageView setImage:image];
    [ image release];
    theWindow = [ aController window];
    theScrollViewSize = [ NSScrollView
                          frameSizeForContentSize:[ imageView frame].size
                          hasHorizontalScroller:[ scrollView hasHorizontalScroller]
                          hasVerticalScroller:[ scrollView hasVerticalScroller]
                          borderType:[ scrollView borderType]
                        ];
    theScrollViewRect.origin = NSZeroPoint;
    theScrollViewRect.size = theScrollViewSize;
    theWindowMaxRect = [ NSWindow
                         frameRectForContentRect:theScrollViewRect
                         styleMask:[ theWindow styleMask]
                       ];
    [ theWindow setMaxSize:theWindowMaxRect.size];
}

追加したのは、最初の動的変数の宣言と、[ image release];の後のコードです。一行ずつ見て行きましょう。

theWindow = [ aController window];

後で使うために、ウィンドウを指すポインタを教えてもらい、変数にセットしています。

theScrollViewSize = [ NSScrollView
                      frameSizeForContentSize:[ imageView frame].size
                      hasHorizontalScroller:[ scrollView hasHorizontalScroller]
                      hasVerticalScroller:[ scrollView hasVerticalScroller]
                      borderType:[ scrollView borderType]
                    ];

これは前回説明しました。NSScrollViewクラスに、scrollViewのsizeを算出してもらっています。

theScrollViewRect.origin = NSZeroPoint;
theScrollViewRect.size = theScrollViewSize;

theScrollViewRectはscrollViewの矩形を表しています。その型は、前回も出て来ました構造体、NSRectです。原点にNSZeroPoint、つまり座標(0,0)を、サイズに算出したscrollViewのサイズをセットしています。

theWindowMaxRect = [ NSWindow
                     frameRectForContentRect:theScrollViewRect
                     styleMask:[ theWindow styleMask]
                   ];

frameRectForContentRect:styleMask:はNSWindowクラスのクラスメソッドです。引数にウィンドウの中身のNSRectとウィンドウのstyle maskをセットして、このメッセージを投げると、ウィンドウのNSRectを見積もってくれます。ウィンドウの中身はscrollViewですから、ウィンドウの中身のNSRectは、先ほど値をセットしたtheScrollViewRectにしています。そしてstyle maskは、ウィンドウ自身から直接教えてもらっています。

[ theWindow setMaxSize:theWindowMaxRect.size];

ウィンドウに対して最大サイズをセットします。先ほどNSWindowクラスにframeRectForContentRect:styleMask:メッセージを投げて教えてもらった結果はNSRectですから、そこからsizeを取り出してセットしています。

これでウィンドウの最大サイズは、画像全体を表示した時のサイズになったはずです。ビルドして実行してみましょう。適当な画像を開いて、zoomボタンを押してみて下さい。ウィンドウは画像全体を表示するサイズに、自動的に調節されたはずです(fig.01)。

[fig.01] 画像のサイズに合わせてウィンドウのサイズが調節される
(サンプル画像は、ゆきみだいふくさんのご好意により、使用させていただいています。)

ついでにresizeコントロールでウィンドウのサイズを変えてみましょう。ウィンドウは画像全体を表示できるサイズ以上に広がらなくなっています。

ところで、画像を開いた直後のウィンドウはどうだったでしょうか。相変わらずInterface Builderで設定したサイズのままです(fig.02)。

[fig.02] 画像を開いた直後は、ウィンドウのサイズが調節されない
(サンプル画像は、ゆきみだいふくさんのご好意により、使用させていただいています。)

しかもこの例の様に、画像が小さいとウィンドウの最大サイズを越えたサイズで開いてしまいます。zoomボタンを押せば調節されるとはいえ、これではMacのアプリとしてあんまりです。

これを解決するために、ウィンドウ自身に中身がどんなサイズなのか教えてやります。theScrollViewSizeを取得した後に、次のコードを加えて下さい。

 [ theWindow setContentSize:theScrollViewSize];

ビルドして実行してみて下さい。今度は、画像を開いた時に、そのサイズに合わせて自動的に調節されたはずです。

さて、これで完璧でしょうか。実は、まだ足りません。この続きは次回です。

前頁目次次頁