selectedBackgroundView修改contentView子视图

时间:2013-01-22 21:36:51

标签: ios uitableview

我正在为backgroundView子类使用自定义selectedBackgroundViewUITableViewCell。这些单元格位于分组表格中,因此我根据UIImageView中的单元格行将背景和所选背景设置为cellForRowAtIndexPath:

我遇到的问题是,当选择单元格时,其selectedBackgroundView会修改contentView的内容。例如,在选择和/或突出显示单元格后,UILabel中的contentView发生了backgroundColor更改,并且用作单元格分隔符的UIView不可见。

选择前: Before selection/highlight 选择后: After selection/highlight

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

  • 注意:由于它是一个分组的表格视图,因此我设置了不同的backgroundView s和selectedBackgroundView s UIImageView s来解释顶部和底部单元格中的圆角cellForRowAtIndexPath:中的部分,但在使用默认UITableViewSelectionStyleBlue时遇到同样的问题。

编辑1:

根据an0的回答,我覆盖了setHighlighted:animated:。我不确定实现的可靠性,但这种方法可以维护子视图的highlightedbackgroundColor属性:

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 个答案:

答案 0 :(得分:44)

UITableViewCell在突出显示/选中时会自动执行两项操作:

  1. 将其所有子视图“backgroundColor设置为清除颜色(透明)。
  2. 突出显示可突出显示的所有子视图,例如UIImageView
  3. 要防止出现第一个问题,您必须在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.
        }
    }
    

答案 1 :(得分:5)

  1. 设置cell.selectionStyle = UITableViewCellSelectionStyleNone
  2. 倍率
  3. - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted){ self.contentView.backgroundColor = colorYouWantWhenHighlighted; }else{ self.contentView.backgroundColor = colorYouWantWhenUnhighlighted; } }

答案 2 :(得分:2)

在我的情况下,我的UITableViewCell中有两个按钮,其背景颜色被清除。这些按钮的类型为GrayButton,我编写的自定义类派生UIButton。我改为覆盖UITableViewCell的{​​{1}}方法,而不是覆盖GrayButton方法:

setBackgroundColor:

答案 3 :(得分: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];

现在问题仅在您点按并开始滚动的单元格不是所选单元格时才可见。