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をつければ解消する。

2006/10/30

ホスト名の変更

Macのターミナルを開くとコマンドプロンプトにマシン名が表示されるのだが、それが

yamada-taro-nokonpyuta

というものになっていた。「ヤマダタロウのコンピュータ」というホスト名だ。hostnameコマンドで確認してみると、マシン名はyamada-taro-nokonpyuta.localとなっている。

これをもうちょっとまともな名前に変更する。マシン名は代々人工衛星の名前を付けることにしているので、今回も新しい名前を探し、kvnat(クワント)という名前にすることにした。1987年に打ち上げられたロシアの人工衛星だ。

この設定の変更は、[システム環境設定]-[共有]-[コンピュータ名]で設定できる。.localの部分はこのインターフェースからは変更できないようだ。

2006/10/25

キーボード・マウスの設定

購入する前に店頭のMacを使っていていつも気になっていたのは、マウスの使い勝手の悪さだった。デザイン優先すぎて実際には易くないことと、画面の割にマウスの移動量が小さいことが原因だろうと思っていた。

iMacを購入してみても、やはりマウス・キーボードが使いにくいと感じることに替わりはなかった。早速カスタマイズをしてみることで、不満の大部分は解消できたと思うので、それをメモしておく。

キーボード
・キーのリピート速度は一番速くする。
・リピート入力認識までの時間は「速い」から2つ目にする。
Macのデフォルトは遅すぎると思う私には、この設定が丁度よい。

iMac付属のマウスの使い勝手の悪さに発狂しそうになった。なぜかと言えば、ブラウザで前のページに戻る動作をコンテキストメニュー、あるいは4番目のボタン以降に割り当てられておらず、ウィンドウ上部までいちいちマウスを動かさなければならなかったからだ。しかし、
こちらも実は設定を調整すると、操作感が劇的に改善する。マウスボタンが1つしかないもんだと思っていたら、3つボタンマウスと同等に動作するのか。

マウスの設定画面を見ていたら、「主ボタン」が左右に表示されていたので、それを変更してみると、右側を「副ボタン」に変えるができる。マウスにはボタンがついていなくて、マウス本体を押し込むことでクリックするようになっているのだが、右側に押し込むのか、左側に押し込むのかで、右ボタン、左ボタンのように2つのクリック動作を判別することができる。結局右ボタンを「副ボタン」に設定することで普通のマウスと同じように動作するようになる。

次に動作がとろい点については、こちらもそれぞれの設定を速めに振ることでほぼ満足いく設定ができた。

・軌跡の速さ「速い」から3つ目
・スクロール「速い」
・ダブルクリックの間隔「速い」から2つ目

とした。

かな漢の起動キーの設定

ことえりが起動できるようになったが、Command + spaceでの入力モード切り替えはとても使いにくいので、これも変更することにした。

CapsとControlキーを入れ替えてあるので、左下のControlの刻印のあるキーを押すとCapsとして振る舞うようになっているが、ことえりの環境設定メニューに、入力操作時にCaps lockキーがどのように動作するかを指定できる項目があった。

この設定を「上げた時「英字を入力」」に設定すると、Capsが入っていない時に英字モード、入っている時にひらがな入力モードになるようだ。

5分ほどこの設定を使って見ているが、使い勝手はそこそこ。Controlキーの場所が正しくないキーボードでControlキーを押す時に小指の付け根でControlキーを押す流派があるのだが、その要領で、入力モードの切り替え時に同じように押せばいい。どうもあと一歩しっくりこないのだが、切り替え時に動作が一旦止まるからのような気がしている。

バックスラッシュキーがreturnキーの上というなかなかいい場所にあるので、WnnチックにControl+\でもいいかなぁと思っている。