1. ホーム
  2. iphone

[解決済み] UITableViewCellのサブビューがセルを選択すると消えてしまう

2022-04-21 09:37:14

質問

カラーチューザーのテーブルビューを実装しているのですが、ユーザーが例えば10色(製品によって異なる)の中から選択することができます。また、ユーザーは他のオプション(ハードディスク容量など)も選択できます。

すべてのカラーオプションは、それぞれのテーブルビューセクションの中にあります。

textLabelの左側に、実際の色を示す小さな四角を表示させたい。

今、私は単純な正方形のUIViewを追加して、それに正しい背景色を与えています、このように。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
        cell.indentationWidth = 44 - 8;

        UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
        colorThumb.tag = RMProductAttributesCellColorThumbTag;
        colorThumb.hidden = YES;
        [cell.contentView addSubview:colorThumb];
    }

    RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
    RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
    cell.textLabel.text = value.name;
    cell.textLabel.backgroundColor = [UIColor clearColor];

    UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
    colorThumb.hidden = !attr.isColor;
    cell.indentationLevel = (attr.isColor ? 1 : 0);

    if (attr.isColor) {
        colorThumb.layer.cornerRadius = 6.0;
        colorThumb.backgroundColor = value.color;
    }

    [self updateCell:cell atIndexPath:indexPath];

    return cell;
}

これは問題なく表示されます。

唯一の問題は、"color" 行を選択すると、フェードから青への選択アニメーション中に、私のカスタムUIView (colorThumb) が非表示になることです。選択/選択解除アニメーションが終了すると、再び表示されるようになりますが、これは醜いアーティファクトを生成します。

これを修正するにはどうしたらよいのでしょうか?サブビューを正しい位置に挿入していないのでしょうか?

(didSelectRowAtIndexPathには特に何もなく、セルのアクセサリをチェックボックスなどに変更し、現在のindexPathを非選択にしているだけです).

解決するには?

UITableViewCell は、セルが選択またはハイライトされたときに、すべてのサブビューの背景色を変更する、あなたはテーブルビューのセルの setSelected:animatedsetHighlighted:animated とビューの背景色をリセットします。

Objective Cでは:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
   UIColor *color = self.yourView.backgroundColor;        
   [super setSelected:selected animated:animated];

    if (selected){
        self.yourView.backgroundColor = color;
    }
}

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
    UIColor *color = self.yourView.backgroundColor;        
    [super setHighlighted:highlighted animated:animated];

    if (highlighted){
        self.yourView.backgroundColor = color;
    }
}

Swift 3.1では.

override func setSelected(_ selected: Bool, animated: Bool) {
    let color = yourView.backgroundColor         
    super.setSelected(selected, animated: animated)

    if selected {
        yourView.backgroundColor = color
    }
}

override func setHighlighted(_ highlighted: Bool, animated: Bool) {
    let color = yourView.backgroundColor
    super.setHighlighted(highlighted, animated: animated)

    if highlighted {
        yourView.backgroundColor = color
    }
}