我正在为backgroundView
子类使用自定义selectedBackgroundView
和UITableViewCell
。这些单元格位于分组表格中,因此我根据UIImageView
中的单元格行将背景和所选背景设置为cellForRowAtIndexPath:
。
我遇到的问题是,当选择单元格时,其selectedBackgroundView
会修改contentView
的内容。例如,在选择和/或突出显示单元格后,UILabel
中的contentView
发生了backgroundColor
更改,并且用作单元格分隔符的UIView
不可见。
选择前: 选择后:
我没有在任何地方看到这种行为。我需要做些什么才能防止这种情况发生?是否有不同的方法来显示细胞选择/突出显示我应该采取哪些措施来防止这种情况?
backgroundView
s和selectedBackgroundView
s UIImageView
s来解释顶部和底部单元格中的圆角cellForRowAtIndexPath:
中的部分,但在使用默认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;
}
}];
}
答案 0 :(得分:44)
UITableViewCell
在突出显示/选中时会自动执行两项操作:
backgroundColor
设置为清除颜色(透明)。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.
}
}
答案 1 :(得分:5)
cell.selectionStyle = UITableViewCellSelectionStyleNone
- (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];
现在问题仅在您点按并开始滚动的单元格不是所选单元格时才可见。