11

のカスタマイズされたサブクラスを作成するUITableViewCellと、結果はプレーンスタイルの長方形のセルではうまくUITableView機能しますが、グループ化されたスタイルのテーブルの丸みを帯びたセルではまったく機能しません。

UITableViewCellグループ化されたスタイルのテーブルで機能するセルを描画するために確実にサブクラス化する方法はありますか?(Interface Builderを使用せずに。)

4

4 に答える 4

9

答えは、サブクラスのメソッド[super layoutSubviews]内で最初に呼び出すのと同じくらい簡単でしょうか?UITableViewCelllayoutSubviews

これが私のコードです。

最初に を作成し、メソッドUITextFieldの に追加します。contentViewinitWithStyle:

- (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で、私はこれを持っています:

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

このコードでは、テキスト フィールドは画面の左から 5 ピクセルの位置にあり、グループ化モードの場合はもちろん、表のセルの左に 5 ピクセルです。つまり、テーブル ビュー セルの外側です。ダメ。

このコードを使用するとinputField、セルの右側に 5px 配置されます。

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

しかし、私はあなたが抱えていた問題を完全に誤解していたかもしれません!

エリック

于 2011-02-27T19:28:05.633 に答える
8

以前はサブクラスで多くの問題を抱えていましUITableViewCellたが、サブクラス化をやめました。contentViewのプロパティにサブビューを追加すると、UITableViewCell私が遭遇したどのインスタンスでも同じことを達成するように見えるので、私は自分の中でそれを行うだけです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;
}
于 2009-11-16T05:22:35.490 に答える
2

私もこの問題に気づきました。私の回避策は、テーブル セルを小さくすることでした (320 ではなく 300 幅)。これは優れたソリューションではありませんが、うまく機能します。

「グループ化」モードの場合、テーブルビューのインセットを個別に削除できるとは思いません。私は間違っているかもしれません!

于 2009-11-10T02:19:16.423 に答える
-1

どのような問題がありますか? drawRect では、四角形が与えられ、合計サイズがわかっています - そのスペースに合わせてください。layoutSubviews を使用している場合も同じです。

于 2009-10-17T19:49:07.733 に答える