23

カスタムbackgroundViewとサブクラスselectedBackgroundViewを使用しています。これらのセルはグループ化されたテーブルにあるため、のセルの行に基づいてUITableViewCell、背景と選択した背景をsとして設定しています。UIImageViewcellForRowAtIndexPath:

私が抱えている問題は、セルが選択されると、セルselectedBackgroundViewの内容が変更されることcontentViewです。たとえば、セルを選択および/または強調表示した後、UILabelcontentViewbackgroundColor変更UIViewされ、セルの区切り文字として使用されていることは表示されません。

選択前:選択 選択/ハイライト前 後: 選択/ハイライト後

この動作がどこにも文書化されていません。これを防ぐために私がしなければならないことがありますか?これを防ぐために、セルの選択/強調表示を表示するための別のアプローチはありますか?

  • 注:これはグループ化されたテーブルビューであるため、のセクションの上部セルと下部セルの丸みを帯びた角を考慮して、異なるbackgroundViewsとselectedBackgroundViewsをsに設定しましたが、デフォルトを使用した場合も同じ問題が発生します。UIImageViewcellForRowAtIndexPath:UITableViewSelectionStyleBlue

編集1:

an0の答えごとに、私は上書きしsetHighlighted:animated:ました。実装の信頼性はわかりませんが、このアプローチはサブビューのプロパティhighlightedとプロパティを維持するために機能しました。backgroundColor

NSArray *recursiveAllSubviews = [self recursiveValueForKey:@"subviews"]; // Uses MTRecursiveKVC Cocoapod
NSArray *backgroundColors = [recursiveAllSubviews valueForKey:@"backgroundColor"];
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
    [recursiveAllSubviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger index, BOOL *stop){
        if ([view respondsToSelector:@selector(setHighlighted:)]) {
            [view setValue:[NSNumber numberWithBool:NO] forKey:@"highlighted"];
        }
        id possiblyNull = [backgroundColors objectAtIndex:index];
        if (possiblyNull != [NSNull null]) {
            view.backgroundColor = possiblyNull;
        }
    }];
}
4

4 に答える 4

45

UITableViewCell強調表示/選択すると、2つのことが自動的に行われます。

  1. すべてのサブビューbackgroundColorをクリアカラー(透明)に設定します。
  2. 強調表示できるすべてのサブビューを強調表示します(例:UIImageView

最初の問題を防ぐには、UITableViewCellサブクラスで次の2つのメソッドをオーバーライドする必要があります。

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
    if (highlighted) {
        // Recover backgroundColor of subviews.
    }
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (selected) {
        // Recover backgroundColor of subviews.
    }
}
于 2013-01-22T23:32:03.377 に答える
5

設定cell.selectionStyle = UITableViewCellSelectionStyleNone およびオーバーライド

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
  if(highlighted) {
    self.contentView.backgroundColor = colorYouWantWhenHighlighted;
  } else {
    self.contentView.backgroundColor = colorYouWantWhenUnhighlighted;
  }
}
于 2013-12-17T16:35:47.987 に答える
2

私の場合、UITableViewCell背景色がクリアされているボタンが2つありました。これらのボタンはタイプGrayButtonで、私が作成した、派生したカスタムクラスですUIButton。メソッドをオーバーライドUITableViewCellするのではなく、代わりにGrayButtonのメソッドをオーバーライドしますsetBackgroundColor:

- (void)setBackgroundColor:(UIColor *)backgroundColor
{
    if (backgroundColor != [UIColor clearColor]) {
        [super setBackgroundColor:backgroundColor];
    }
}
于 2013-11-18T20:55:14.930 に答える
0

私の場合、contentViewに切り替えましたが、はるかにうまく機能します

UIColor *backgroundColor = selected ? [UIColor redColor] : [UIColor clearColor];
self.contentView.backgroundColor = backgroundColor;

selectedBackgroundViewを置き換える代わりに

UIView *selectionColor = [[UIView alloc] init];
selectionColor.backgroundColor = selected ? [UIColor redColor] : [UIColor clearColor];;
self.selectedBackgroundView = selectionColor;
[selectionColor release];

この問題は、タップしてスクロールを開始したセルが選択したセルではない場合にのみ表示されます。

于 2014-03-20T11:22:11.663 に答える