理系学生日記

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

忍者TOOLS

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

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

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

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

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 のことを指してる)やメソッドが、
テーブルやセクションのフッタにもあるよ。

Cocoa with Love: Easy custom UITableView drawing

というわけですので、ちょっと実験してみましょう。セクションヘッダに、ボタンでも追加してみましょう。

- (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