2012年10月17日水曜日

グループ化されたUITableViewのセルを行単位でインデントする

  • 例によって、いい情報がなかったので。
  • iOS標準のアドレス帳(の編集画面)っぽく、UITableViewのCellインデントしたいケースがある。
    • ぶっちゃけ個人的に真似してみたかっただけ。
  • xibを用いる方法としてTableViewを含むViewを作って、TableViewを含むControllerに差し込む方法が考えられる。だがこの方法だとTableView自体に微妙にグラデーションがかかっているため見栄えが悪くなる。
    • なによりTableViewがふたつできて、delegateの呼び出すメソッドが二重になるという時点で泣きたくなるというかそもそも上手く動くのかすらわからない。
  • UITableViewCellのサブクラスを作成してStoryBoard上でインデントしたいCellに適用することでうまく動作した。
  • 掲示板でこんな感じにしたらーというやりとりがあったのでほぼ引き移し。とてもビューティフルとはいいがたいすなー。
  • コードは以下のような感じ
========================================
#import "IndentTableViewCell.h"

@implementation IndentTableViewCell{
    CGRect original;
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        original = CGRectMake(0,0,0,0);

    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

}

-(void) layoutSubviews
{
   
    [super layoutSubviews];
    if(original.size.width==0){
        original = self.frame;
    }
    CGSize offset = CGSizeMake(120,30);
    CGFloat newX = original.origin.x + offset.width;
    CGFloat newWidth = original.size.width - offset.width;
    CGRect newFrame = CGRectMake(newX,original.origin.y, newWidth, original.size.height);
    self.frame = newFrame;
   
}

@end
========================================
  • 端末を回転したときとかはうまく動かないので回転対応する場合は追加のコードが必要になるが、はじめて二週間と半分なのでそこまで学習できてないです(><)素人ですみません。
  • やってることは至極当然のことっぽいですね。あーこんなのWindowsでも10年くらいまえにみたわー。おれやったことあるわー。
  • iOS5.1target+Storyboard+ARCで組んでます。
  • あとでBlogger用のコードフォーマッターさがそう。古いのが新しいテンプレートで使えなくなってるんだよなあ。

(追記)単にこれだけだとiOS5.1以前で表示が崩れることが判明。むーん。独自にビューを作るしかないかー。 ただまあ考え方は便利なので残しておく。