2009-05-21
■ [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について
![[iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント](http://r.hatena.ne.jp/images/popup.gif)
※UIPickerViewではまってしまっていたことの備忘録です。iPhone OS3.0ではどうなっているか分かりませんので*1、あくまで2.2.1ということで。
例のドラム型のピッカーUI(UIPickerView)では、アイテムの表示方法に2種類のデリゲートを用意しています。
// 1) 文字列を返したい場合 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {} // 2) ビューを返したい場合 - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {}
ちなみに2が書いてある場合、1は書いてあっても無視されます。2でnilを返しても同様。
そして後者を使う場合には、次のようにして既存ビューの存在を確かめつつ、その中の情報を埋めていくわけで。
- (UIView *)pickerView:(UIPickerView *)picker viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { UILabel *label; if (view == nil) { view = [[UIView alloc] initWithFrame:CGRectZero]; // @TODO: Rectangleの適当なサイズや、フォントが分かっていない。 // ここでの23pxの高さは目測で調べました。 label = [[UILabel alloc] initWithFrame:CGRectMake(-30.0f,-11.0f,80.0f,23.0f)]; label.backgroundColor = [UIColor clearColor]; label.opaque = NO; label.alpha = 0.85f; label.textAlignment = UITextAlignmentLeft; label.baselineAdjustment = UIBaselineAdjustmentAlignBaselines; // タグを0オリジンにしてセットしてはダメ(既存の何かとぶつかるみたい) [label setTag:component+100]; [view addSubview:label]; [label release]; } else { label = (UILabel *)[view viewWithTag:component+100]; } // 表示するテキストを埋め込み label.text = [NSString stringWithFormat:@"row:%d", row]; return view; }
ポイントはビューの座標。どうも各要素での{0,0}の位置はPicker内各Rowのど真ん中にあるらしく、サンプルのように負数を指定してあげないとどこかに寄った状態になってしまうみたいです。
ですので、
- ビューの高さ : 23pxの半分なので11か12をセット
- ビューの幅 : 事前に指定しておいたrowの幅の半分の値をセット
としてあげると良いみたいです。
最初、このことが分からずに一向に情報を表示してくれないPickerViewに業を煮やしておりましたです、ハイ。
補足
UIViewを返すデリゲート、必ずUIViewを返さないとうまく動いてくれません。このサイトやこのサイトで紹介されているようなUILabelを直接渡してあげる方法は、少なくとも私の環境(2.2.1)では何も表示されませんでした。
もしこの方法で表示している方がいたらば教えてください。
現在の不明点
*1:分かったとしても書けないし。
ところで、文中ではUILabelを直接渡す方法ができないとおっしゃってますが、試したところ無事成功する方法を見つけたのでサンプルコードをご紹介させていただきますね。
http://akisute.com/2009/06/uipickerview.html
それではまたー。
ありがとうございます!お互い頑張っていきましょう。