2011年3月15日火曜日

[iOS] UITableViewを水平方向にスクロールさせる方法

リスト表示にとても便利なUITableViewですが、ひとつ弱点があります。
それは垂直方向へのスクロール(vertical scrolling)しか認められていないこと。

大抵の場合はそれでも問題ないでしょうが、iPhoneの限られた画面に埋め込む場合、横長のパーツを作って水平方向へスクロール(horizontal scrolling)させたい時があります。

UIScrollViewのサブクラスを作ってごにょごにょさせるのも面倒だし簡単な方法はないものかと色々探していたら、これはと思う方法を見つけたのでメモしておきます。


簡単にいえば、UITableViewのtransformをいじってviewをごそっと回転させます

Horizontal UITableView – Rankometer 4Google

元ネタは上のブログ記事です。
ただ、元ネタのソースをコピーすると、データソースの先頭が右側になるので、回転させる方向を変更しています。

    CGRect tableViewRect = CGRectMake(0.0, 0.0, 50.0, 320.0);
    self.tableView = [[UITableView alloc] initWithFrame:tableViewRect style:UITableViewStylePlain];
    tableView.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
    tableView.delegate = self;
    tableView.dataSource = self;

    // テーブルを逆時計回りに90度回転させる。     
    tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
 
    // スクロールバー(インジケーター)が上部に出るので、気になる場合は消しておく
    tableView.showsVerticalScrollIndicator = NO;
これでテーブルビューが水平方向にスクロールするようになります。
ただ、このままだとテーブル内のセルが逆時計回りに90度回転してしまっているので、セルの向きを補正します。
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell;
    cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];
    if (cell == nil) {        
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier@"identifier"] autorelease];

        // セルを時計回りに90度回転させる。
        cell.contentView.transform = CGAffineTransformMakeRotation(M_PI / 2);
    }
    
    return cell;
}

0 件のコメント: