ようやくウィンドウサイズを自由にできる方法がわかったのでキャプチャに使ってみる。仕切り直しにコードを新しく書き直した。
サンプル:WebViewSample-1.zip
InterfaceBuilderでコントロール用の小さなウィンドウを用意する。
アプリケーションを起動したタイミングで WebViewとそれを表示するボーダレスウィンドウをコードから作成する。
AppController.m
- (void)awakeFromNib
{
NSRect rect = NSMakeRect(0, 0, 100, 100);
_window = [[NSWindow alloc] initWithContentRect:rect
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
_view = [[WebView alloc] initWithFrame:rect];
[[[_view mainFrame] frameView] setAllowsScrolling:NO];
[_window setContentView:_view];
[_window makeKeyAndOrderFront:nil];
}
最初は左下に 100x100の小さなウィンドウ(白)が現れる。
URLを入力し Loadボタンで読み込み、Captureボタンでキャプチャする。Webページの大きさに合わせてウィンドウが拡大される。
キャプチャコードはこんな感じ。Paparazzi! で使われていた NSBitmapImageRep#initWithFocusedViewRect: を使ってみた。
- (IBAction)capture:(id)sender
{
// (1) filename
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test2.png",
[paths objectAtIndex:0], nil];
// (2) size
NSRect rect = [[[[_view mainFrame] frameView] documentView] bounds];
[_window setContentSize:rect.size];
// (3) capture
[_view lockFocus];
NSBitmapImageRep* bitmap_rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
[_view unlockFocus];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];
[data writeToFile:path atomically:YES];
}
出た。Flashも行けそうだ。
- - - -
ずいぶん時間がかかったが、再現力の高い方法が見つかった(メモリは大量に使いそうだが)。