2009-10-17 14 views
11

UITableViewCellのカスタマイズされたサブクラスを書くとき、結果は平型のUITableViewの長方形のセルではうまくいくが、グループ化されたスタイルのテーブルの丸いセルでは全く機能しないことがわかった。グループ化されたUITableViewのためにUITableViewCellを確実にサブクラス化する方法は?

UITableViewCellを確実にサブクラス化して、グループスタイルのテーブルで動作するセルを描画する方法はありますか? (Interface Builderを使用しないで)

答えて

-1

あなたはどんな問題を抱えていますか? drawRectでは、rectを与えられ、合計サイズを知っています。ちょうどそのスペースに適合しています。あなたがlayoutSubviewsを使用している場合、同じこと。

+2

問題は、(背景を明らかにする側面、それはまた、セクションの上部と下部のセルの角を丸め)細胞の一部を遮断するグループ化されたモードでのUITableViewあります。 – jbrennan

+0

うん、それは問題だ。 –

+1

さらにいくつかのテストを行った後、テーブルビューのセルがdrawRectの正しいサイズで渡されないことは間違いありません。代わりの方法として、標準のUITableViewCellのカスタムbackgroundViewを設定し、そこにすべての図面を作成する方法があります。あなたはセルを正しい幅にしますが、丸い上端と下端を正確にあなた自身で描画しなければなりません。 –

2

私はこの問題にも気付きました。私の回避策は、テーブルセルを小さくすることです(320ではなく、300の幅)。それは素晴らしい解決策ではありませんが、うまくいきます。

「グループ化」モードでは、個別にテーブルビューのインセットを削除することはできません。私は間違っている可能性があります!

8

私は以前はサブクラスUITableViewCellで多くの問題を抱えていましたが、その後サブクラス化をやめました。 のcontentViewプロパティにサブビューを追加すると、私が実行したすべてのインスタンスで同じことが達成されているようですので、私はUITableViewControllerの中でそれを行います。

- (UITableViewCell *)tableView:(UITableView*)tableView 
     cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{  
    static NSString* CellIdentifier = @"AccountDetailsCell"; 
    UILabel* mainLabel = nil; 
    UILabel* valueLabel = nil; 
    const CGFloat kAccountDetailFontSize = 14.0; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
             reuseIdentifier: CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 150.0, 44.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     mainLabel.textAlignment = UITextAlignmentLeft; 
     mainLabel.textColor = [UIColor darkGrayColor]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
     mainLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: mainLabel]; 

     valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake(150.0, 0.0, 150.0, 44.0)] autorelease]; 
     valueLabel.tag = VALUELABEL_TAG; 
     valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     valueLabel.textAlignment = UITextAlignmentRight; 
     valueLabel.textColor = [UIColor darkTextColor]; 
     valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     valueLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: valueLabel]; 
    } 
    else 
    { 
     mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG]; 
     valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG]; 
    } 

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row]; 
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath]; 

    return cell; 
} 
+0

私は、このアプローチが自分のニーズに十分ではないことを発見しました。私は、複数の行のタイトルと複数行の説明を持つセルを持って、2つのラベルに含まれるテキストに基づいてそれ自身を自動化します。私は - (void)layoutSubviewsをサイズ変更していますが、最初に[super layoutSubviews]を呼び出すことを覚えていますが、self.contentViewはこの呼び出しの後までサイズ変更されていないようです。 – Johnus

+0

そのような方法は良いですが、ラベルの影のようなQuartzCoreを使いたい場合は、スクロールが遅くなり、セルを自分で描画する必要があります。 – Alexander

+0

私はそれ以来、多くの問題が多くの最近のSDKで修正されているので、サブクラスに関してもっと幸せでした。私の現在のメソッドは、 'configureWithDataObject:(id)dataObject'メソッドを持つサブクラスを使用して、カスタムセルをサブクラス化します。私のビューコントローラは自動的に正しいセルサブクラスを選択し、 'configureWithDataObject:'を呼び出します。開発を迅速かつ容易にします(ただし、静的コードで行うよりも技術的に効率的ではありません)。 – jessecurry

9

答えは最初にあなたのUITableViewCellサブクラスのlayoutSubviewsメソッド内[super layoutSubviews]を呼び出すような単純なものでした:ここ

は、タイトルと値を持っている例ですか?

ここに私のコードです。私はUITextFieldを作成し、initWithStyle:方法でcontentViewに追加

まず:そのコードで

-(void)layoutSubviews 
{ 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

、テキスト:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     inputField = [[UITextField alloc] initWithFrame:CGRectZero]; 
     [self.contentView addSubview:inputField]; 
     inputField.borderStyle = UITextBorderStyleLine; 
     [inputField release]; 
    } 
    return self; 
} 

次にlayoutSubviewsに、私はこれを持っていますフィールドは画面の左から5pxです(グループモードのときはテーブルセルの左に5pxです)。つまり、テーブルビューセルのOUTSIDEです。いいえ。

使用私はそれになりたいようにこのコードとinputFieldは、セルの右に5pxのが置かれます

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; // the magic line 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

私は完全にかかわらず、あなたが持った問題を誤解している可能性が!

エリック

+0

どうすればそれを逃すことができますか?魔法のラインをありがとう! – nonamelive

関連する問題