前日のデリゲートメソッドで指定されたビューのサイズは得られるのだが、実際にビューが載るウィンドウのサイズを決めなくてはいけない。
ビューとウィンドウの位置関係はこんな感じ。
今回は左下(origin)の位置関係は変えず、サイズだけ調整することにしよう。
それぞれの初期範囲を下記とする。これは Interface Builderで配置されている位置関係となる。
ビューの初期範囲:{{vx0, vy0}, {vw0, vh0}}
ウィンドウの初期範囲:{{wx0, wy0}, {ww0, wh0}}
次に、新規ウィンドウが開いたときのそれぞれの範囲を下記とする。
ビューの範囲:{{vx, vy}, {vw, vh}}
ウィンドウの範囲:{{wx, wy}, {ww, wh}}
デリゲートメソッドで渡されるのはビューの範囲だけなので、これと初期範囲の値から、ウィンドウの範囲を求める必要がある。
まず左下の位置(origin)から。
wx = vx + ( wx0 - vx0 )
wy = vy - ( wy0 - vy0 )
次にサイズ。
ww = vw + ( ww0 - vw0 )
wh = vh + ( wh0 - vh0 )
どちらも初期状態の差分を加えるだけ。ツールバーやステータスバーの表示制御があると少し面倒にはなるが基本的な考えは変わらない。
実装を入れてみよう。
デリゲートメソッド内で外側のウィンドウのサイズを計算して設定する。ちと雑なコードだが動作をみるには十分。
- (void)webView:(WebView *)sender setFrame:(NSRect)frame
{
NSRect window_rect;
window_rect.origin = [sender convertPoint:frame.origin toView:nil];
window_rect.origin = [_main_window convertBaseToScreen:window_rect.origin];
window_rect.size = frame.size;
window_rect.origin.x += _window_rect0.origin.x - _view_rect0.origin.x;
window_rect.origin.y += _window_rect0.origin.y - _view_rect0.origin.y;
window_rect.size.width += _window_rect0.size.width - _view_rect0.size.width;
window_rect.size.height += _window_rect0.size.height - _view_rect0.size.height;
[_main_window setFrame:window_rect display:YES];
}
確認用に HTMLファイルを用意した。
openchild1.html
<html>
<head>
<title>SAMPLE: Parent window</title>
<script>
function openChildWindow() {
window.open("openchild2.html", "Child",
'location=0,toolbar=1,directories=0,scrollbars=1,menubar=0,resizable=0,width=800,height=600');
}
</script>
</head>
<body>
<a href="JavaScript:openChildWindow()">open a child window</a><br/>
<br/>
width: 800 / height: 600
</body>
</html>
JavaScriptで子ウィンドウをオープンする。
実行してみよう。
親となるHTMLを開く。
リンクを押して子ウィンドウを開く。
window.open() で指定した {800,600}のサイズで開いた。