理系学生日記

おまえはいつまで学生気分なのか

TableView の SectionHeader はカスタマイズできる

UITableView は iOS の中心とも言える View であるため、API としても様々な部分がカスタマイズできるようになっています。 UIView として宣言されている ReadOnly でないプロパティは、(自明ですが)カスタマイズ可能と考えてまずまちがいありません。

|objc| @property (nonatomic, retain) UIView tableHeaderView; @property (nonatomic, retain) UIView tableFooterView; @property (nonatomic, retain) UIView *backgroundView; ||<

しかし、TableView はテーブルヘッダ、セクションヘッダ、セクションフッタ、テーブルフッタ、そしてテーブル本体から構成されるにも関わらず、セクションヘッダやフッタの View をカスタマイズできる API が UITableView には用意されていません。ぼくはこの事実から、「あーセクションのヘッダ/フッタは柔軟なカスタマイズをできない構成になっているのか」というメッセージを読み取ってしまっていました。 しかし、どうやらこれは間違いのようでした。下記エントリに、こんな記述があります。

Easy custom UITableView drawing> You can include a custom header for every table section by implementing the UITableViewDelegate method tableView:viewForHeaderInSection:. There are equivalent properties and methods for the table and section footers.

(抄訳): UITableViewDelegate のメソッド tableView:viewForHeaderInSection: を 実装することで、各テーブルセクションにカスタムヘッダを入れ込むことができる。 そして、同様のプロパティ(※tableFooterView のことを指してる)やメソッドが、 テーブルやセクションのフッタにもあるよ。 << というわけですので、ちょっと実験してみましょう。セクションヘッダに、ボタンでも追加してみましょう。

|objc| - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 40.0; }

  • (UIView )tableView:(UITableView )tableView viewForHeaderInSection:(NSInteger)section { UIView containerView = [[UIView alloc] init]; UIButton button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button1.frame = CGRectMake(10, 10, 70, 20); [button1 setTitle:@"button1" forState:UIControlStateNormal];

    [containerView addSubview:button1]; return containerView; } ||< http://img.skitch.com/20110829-1edyshiftrd271ym4qcardrwhn.jpg