ページ

2009年12月8日火曜日

NSImage の isFlipped/setFlipped: が Deprecated

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

NSImage を NSView へ描画するコードを書いていて isFlipped/setFlipped: が Mac OS X v10.6 から Deprecated になっているのに気がついた。

Mac Dev Center: Deprecated NSImage Methods

なんてこった。便利なのでよく使っていたのだが。。


flipped な NSView に NSImage を drawAtPoint:fromRect:operation:fraction: などでそのまま描くと画像は上下反転して描かれる。


今までは -[NSImage setFlipped:YES] を呼んでおくと座標系が合って正しく描画されていた。
setFlipped: が使えないとなるとどうすれば良いのか。


リファレンスを眺めていると NSAffineTransform を使って座標系を変更する方法が示されていた。
Mac Dev Center: Cocoa Drawing Guide: Coordinate Systems and Transforms

紹介されいたコードはこう:

- (void)drawRect:(NSRect)rect
{
NSRect frameRect = [self bounds];
NSAffineTransform* xform = [NSAffineTransform transform];
[xform translateXBy:0.0 yBy:frameRect.size.height];
[xform scaleXBy:1.0 yBy:-1.0];
[xform concat];

// Draw flipped content.
}

なるほど。
試してみたところうまくいった。

setFlipped: を使っている過去のコードは書き換えた方が良さそうだ。

(追記)
v10.6 からは lockFocusFlipped: が用意された。座標変換ではなくこっちを使うようだ。

Mac Dev Center: NSImage Class Reference

座標変換するとかなりややこしいことになるのでこっちの方が良い。
ただ 10.5 と 10.6 両対応しようとすると lockFocusFlipped: と setFliiped: のどちらをつかうかを実行時に判断する必要がある。


(追記)
v10.6  から drawInRect:fromRect:operation:fraction:respectFlipped:hints: が用意された。
Mac Dev Center: NSImage Class Reference
これを使えば簡単に flip できる。
(Kenさんの情報より)