開発メモ:NSImageの描画(上下反転)

Twitterクライアント、KIMwitterの開発で、NSCollectionViewを便利に使ってきたが、限界を感じてきた。

  • Webからの投稿にはないが、クライアントからの投稿には改行が多いものがある
  • 改行が多いツイートを表示するためには、CollectionViewItemViewの高さを広げなければいけない
  • 動的にやる方法がわからない
  • 資料が少ない

ということで、NSTableViewを使って、カスタムセル(カスタムビュー)に挑戦することにした。
レイアウトがInterfaceBuilderではできなくなるが、おそらく動いているソフトにできて、できないことはないだろう。また、情報も見つかっている。

で、いきなりはまったのが、アイコンの表示。手始めに、アイコンと、ユーザ名だけ表示したのだが、なぜか、アイコンが上下逆さまに表示されている。左右はあっているようだ。

調べると、ファイルと画面でY座標の方向が逆なのが原因らしい。対応方法はいろいろあり、座標変換したり、テンポラリ・ビットマップ作ったり、いろいろな方法でできるらしいが、snow Leopard以降でよければ、NSImageの次のメソッドで一発でできた。

– (void)drawInRect:(NSRect)dstSpacePortionRect fromRect:(NSRect)srcSpacePortionRect operation:(NSCompositingOperation)op fraction:(CGFloat)requestedAlpha respectFlipped:(BOOL)respectContextIsFlipped hints:(NSDictionary *)hints;

長い。このメソッド一つで、ツイッターの制限超えたので、ブログにした。

fractionパラメータまでは、全く同じの別メソッドがある。解決まではそれを使っていて上下逆さまになっていた。

で、その次のrespectFlippedパラメータをYESにすると、上下反転で描画される。つまり、期待通りに描画される。正しいNSImageをもっているならNOにすればいいわけだ。

最終パラメータ、hintsはマニュアルをよく読んでいないが、必要なさそうなので、nilにしている。動いてはいる。

とりあえず、アイコンとユーザ名が描画できたので、次は、NSCollectionViewの時に表示していた残りの情報、時刻・本文・使用ソフトを描画する。

そして、Windowサイズの変更に描画位置を対応させ、また、行ごとに、TableViewの高さを設定する方法はわかっているので、計算方法を調べて実装に挑戦するだけだ。

Core Dataで作ってきていてよかったな、と実感しているのは、たとえ描画が全然出来ていない状態でも、バックグラウンドは、変更前の状態のまま完全に動作するので、タイムラインが取得できていることだ。ビューが実装出来れば、その時点で最新の状態が表示できる。MVC!!!

また、今、最新リリースバージョンでは、3つのタブを持ち、それぞれにNSCollectionViewを使っているが、現在はホーム・タイムラインを表示するビュー(タブ)だけをいじっているので残りのタブはデバッグ中でもそのまま動かせるのもいいところ。リリースはできないけど。

さらに、Cocoaのアーキテクチャで、NSCollectionView→NSTableViewの変更では、NSArrayControllerまで(データストアから)をいじる必要が全く無いので、元に戻すのもやろうと思えばすぐ。

いろんなフレームワーク使ってきたけど、ここまで大胆にビューいじって、破綻してないのって初体験かも。Web系以外。

コメント