Developer's Blog

UITableViewCell の accessoryView を使うと少し楽

UITableViewCell の accessoryView というプロパティについてです。それほどマイナーなプロパティでもないので、実は当たり前なのかもしれませんが、最近便利さに気付いたので紹介します。

UITableViewCell には accessoryType というプロパティがあって、3種類のアクセサリが付けられます。

accessoryView は、これをカスタムな見た目にしたい時に使うぐらいのものだという認識でした。実際そうなのですが、よく考えたら UIView ならなんでも入れられるわけで、UISwitch だって入れられるんだなと。設定画面でスイッチがよく出てくるのですが、今まで contentView に addSubview していて、位置を合わせるのが面倒だと思っていました。でも accessoryView なら次のコードで終わりです。frame の origin は0でよくて、UISwitch はサイズを無視するので CGRectZero でいけますね。レイアウトも問題なさそうです。

UISwitch *switch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = switch;

一方、contentView に addSubview する場合は、位置の調整が必要になります。

CGRect frame = CGRectMake(198.0, 12.0, 94.0, 27.0);
UISwitch *switch = [[[UISwitch alloc] initWithFrame:frame] autorelease];
[cell.contentView addSubview:switch];

設定でよくあるアカウント入力でも同じ技が使えます。

cell.textLabel.text = @"ユーザー名";
UITextField *field = [[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 180, cell.frame.size.height)] autorelease];
field.textColor = [UIColor colorWithRed:59.0/255.0 green:85.0/255.0 blue:133.0/255.0 alpha:1.0];
field.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
field.textAlignment = UITextAlignmentLeft;
cell.accessoryView = field;

accessoryView は右端にレイアウトしてくれるので、幅だけ考えれば OK です。他にも嬉しいことがあります。contentView に適当に addSubview すると、textLabel と重なってしまいます。accessoryView を使えば、ただ位置を合わせるだけでなく accessoryView のレイアウトに合わせて textLabel のサイズが自動的に変わるので安心です。デフォルトで編集中は accesoryView は隠れてくれますし、editingAccessoryView なども設定できます。

accessoryView 以外でも UITableViewCell はもともとあるプロパティのビューを使えば、ハイライト時に反転してくれるなど色々やってくれます。パフォーマンスが求められる画面などでは contentView のサブビューの drawRect で描画するのが良いと思いますが、設定画面などそれほど速度が重要でないところでは標準のもので実現できないか考えてみてください。少しは開発が楽になるはずです。

ただ、accessoryView という名前なので、あまりアクセサリっぽくないものを入れてしまうとコードがわかりにくくなるので注意してください(UITextField も怪しいといえば怪しいですが…)。accessoryView を使うと accessroyType が無効になるのですが、両方使えたらいいのになと思う今日この頃です。

Copyright © 2019 Fenrir Inc. All rights reserved.