0

アプリの設定ビューを作成していますが、そのビューには UITableView があります。ニーズを満たすカスタム セルを作成していますが、問題があります。最後のセルだけが[layoutSubviews]. 私は何か間違ったことをしていますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //int type = (indexPath.row == 0?1:0);
    //if(indexPath.row == 6) type = 2;

    NSLog(@"row %i created", indexPath.row);
    TableCell *cell = [[TableCell alloc] initWithType:indexPath.row];

    cell.textLabel.text = @"Test cell";

    return cell;
}

そして私のカスタムセルで:

@implementation TableCell

UIImageView *shadowView;
int row;

- (id) initWithType:(int)type {
    row = type;

    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    self.backgroundColor = [UIColor clearColor];
    self.backgroundView = [[UIView alloc] init];

    UIImage *shadowImage = [UIImage imageNamed:@"CellShadow"];
    shadowImage = [shadowImage resizableImageWithCapInsets:UIEdgeInsetsMake(14, 14, 14, 14)];

    shadowView = [[UIImageView alloc] initWithImage:shadowImage];

    [self.contentView addSubview:shadowView];
    //[self.contentView sendSubviewToBack:shadowView];

    NSLog(@"agreed, row %i created", row);

    [self layoutSubviews];

    return self;
}

- (void) layoutSubviews {
    NSLog(@"row: %i", row);

    [super layoutSubviews];

    shadowView.frame = CGRectMake(
        0, 0,
        self.contentView.frame.size.width,
        self.contentView.frame.size.height
    );
}

@end

継続的に、最後のセル #6 のみが、回転するとき、または layoutSubviews を呼び出す必要があるときに報告されます。助言がありますか?

4

4 に答える 4

3

layoutSubviews直接電話しないでください。[self setNeedsLayout]またはを使用し[self layoutIfNeeded]ます。ただし、セルの init メソッドではこれらをまったく呼び出さないでください。

また、[[TableCell alloc] initWithType:indexPath.row]; を呼び出さないでください。直接、どちらか。代わりに、使用...

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

そのセルを作成したら、それが行であることがわかりますが、テーブルがスクロールするとセルがリサイクルされることに注意してください。そのため、 を呼び出すたびにその値を更新する必要がありますcellForRowAtIndexPath

テーブルビューのサイズが変更されると、セルは再びレイアウトされるはずです (直接または間接的な呼び出しを行う必要はありません)。

こちらのテーブルビューのドキュメントを参照してください。

于 2013-05-07T17:19:18.003 に答える
0

自分でlayoutSubviewsを呼び出さないでください。セル内のサブビューのフレームが変更されるたびに呼び出されます。カスタムセルのラベルのテキストを変更しただけでは、layoutSubviews は呼び出されません。パフォーマンスを向上させるために再利用するためにセルの両端キューを使用します。毎回セルを割り当てるわけではないため。そして、割り当てられたセルが解放されず、新しいセルが作成されるため、コードには多くのメモリの問題があるように見えます。

于 2013-05-10T18:35:29.317 に答える
0

問題は私自身の貧弱なコードでした。ここでの使用cell.backgroundViewは大いに役立ちました。

于 2013-05-10T17:08:59.357 に答える