23

我正在使用自定义backgroundViewselectedBackgroundViewUITableViewCell类。这些单元格位于一个分组表中,因此我UIImageView根据单元格在cellForRowAtIndexPath:.

The problem I'm having is that when the cell is selected, its selectedBackgroundViewmodifies the contents of the contentView. 例如,在选择和/或突出显示一个单元格后,其中UILabelcontentView有其backgroundColor变化,UIView并且用作单元格分隔符的 不可见。

选择前: 选择/突出显示之前 选择后: 选择/突出显示后

我没有在任何地方看到这种行为。我需要做些什么来防止这种情况发生吗?是否有不同的方法来显示我应该采取的单元格选择/突出显示来防止这种情况?

  • 注意:由于它是一个分组的表格视图,我设置了不同backgroundView的 s 和selectedBackgroundViews 与UIImageViews 来解释部分中顶部和底部单元格的圆角cellForRowAtIndexPath:,但是在使用 default 时我遇到了同样的问题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突出显示/选择时自动做两件事:

  1. 将其所有子视图设置backgroundColor为清除颜色(透明)。
  2. 突出显示所有可以突出显示的子视图,例如UIImageView.

为了防止第一个问题,你必须在你的UITableViewCell子类中重写这两个方法:

- (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

set cell.selectionStyle = UITableViewCellSelectionStyleNone and override

- (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它们的背景颜色正在被清除。这些按钮属于类型GrayButton,是我编写的派生的自定义类UIButton。我没有覆盖UITableViewCell方法,而是覆盖了GrayButtonsetBackgroundColor:方法:

- (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 回答