2007/01/31

セル配置の修正

NSMatrixのセル幅計算がうまく行かなかった問題を調査した。やはり頼るべきはReference manualだ。

まずセル幅計算が微妙に狂う理由は、セルとセルの間にある余白が原因であることが分かった。これは、(NSSize)NSMatrix: intercellSpacing で取得でき、このアプリの場合は(2,2)であった。このピクセル数とセル幅を足すとめでたく64ピクセルになって正しい表示ができる。

前回Interface Builderで見た値を決め打ちで使っていたセルの幅も(NSSize)NSMatrix:cellSizeで取得できる。

2007/01/23

NSMatrixのセルの動的配置

前回書いた通り、NSMatrixへのセルの配置をちゃんとやってみることにした。

まず決め打ちしていた横のセル数は親の横幅を取得し、そこから算出すればよいはずと考えそのように書いてみたところほぼうまく行った。

ここで使っているNSMatrixはNSViewを継承していて親はNSView:superviewで取得できる。NSViewでは、NSView:frameを使えば縦横の大きさが取得できる。

// Get parent view's width.
NSView* parent = [self superview];
NSRect rect = [parent frame];
int cols_per_line = rect.size.width / 62;

最後の62という値はInterface Builderのプロパティとして表示されていたものを決め打ち。本当はセルの横幅を取らなければいけない。

もう1つ前回ちゃんと動いていなかった画像が追加されるセルが間違っていた問題は、画像モデルの配列要素数をNSMatrixのセルインデックスに使えばよいのに、NSMatrixのセルの個数を使っていたという単純な誤りだった。

この2つを直したところほぼ思った通りに動いてくれた。


そして、セルをどんどん追加していくとこんな感じ。


最後のセルが微妙にずれていて、一部隠れているのが気になるところ。どうも決め打ちした62という値が悪いような気がする。62ではなく何らかの幅が足されて実際は64ずつ増えているとすると、ほぼこの現象が説明できる。セル間の余白か何かがあるのだろうか?

今日はここまで。次のゴールは以下の3つ:
  1. ウィンドウをリサイズした時にも並べ直ししなければならないけれど今はそれに反応しない。ウィンドウのリサイズイベントを拾って再配置するコードを追加すれば良いだろう。
  2. セルのサイズをちゃんと取得しよう。NSMatrixにはセルのクラスを取得するメソッドがあるので、それを使えばよいような気がするのだが、セルそれぞれの大きさが違うことはあるのか。
  3. Interface Builderで得られる62ピクセルという幅のセルを配置するとなぜか計算が微妙にずれる問題の原因を突き止めよう。上記の通り、セルの余白が怪しいと思う。

2007/01/15

NSMatrixで新しいセルが表示されない

Cocoaプログラミングの練習で、サムネイルの一覧を表示するような簡単なアプリケーションを作ってみようと思っている。ウィンドウ上にボタンをクリックすると画像サムネイルが1つ追加されるというだけのものが今日のゴールとしてみた。

新しいセルの追加はNSMatrix:renewRos:columnsで出来たが、新しく追加したセルがウィンドウに表示されなかった。しばらくネットを探したり試行錯誤したりした結果、NSMatrix:setToCellsを呼ばないといけないことが分かった。

ネットの情報は断片的なので、今回も結局はAppleのreferenceが解決のきっかけを与えてくれた。やはりまずはリファレンスを当たるのが重要だ。

次のゴール
現在の実装には2つ問題があるのでそれを直そう。
  1. 横一列表示されるサムネイル表示セルの数が決め打ちで4つになっているので、それをウィンドウのサイズとセルのサイズから計算してギリギリまで詰め込む。
  2. 画像を一番後ろのセルに表示させているので、セル表示が1段増えた時、一番右のセルに画像が入ってしまうバグがあるのでこれを直す。
関連ページ
NSMatrixに追加した新しいセルが表示されない場合

2007/01/05

Undefined symbols: .objc_class_name_NSObject

簡単なObjective-Cプログラムを書いてみて、コマンドラインgccコンパイラでコンパイルした時次のようなエラーが出た。

kvant:~/src/objc gaku$ make
gcc -o frac Fraction.m main.m
/usr/bin/ld: Undefined symbols:
.objc_class_name_NSObject
_objc_msgSend
collect2: ld returned 1 exit status
make: *** [frac] Error


これは、NSObjectが入っているライブラリがリンクされていないために起こる。-framework Cocoaをつければ解消する。