自定义的UITableViewCellselect风格?
当我点击我的UITableViewCell
,背景部分(我的背景图片未覆盖的区域)变成蓝色,当我点击单元格时。 此外,单元格上的所有UILabel
在点击时都会变成白色,这正是我想要的。
然而,我不想要的是当我点击它的蓝色背景,但如果我做的selectionstylenone
,然后我丢失在单元格中的UILabel
的高亮颜色。
那么有没有什么办法可以在单击单元格的时候摆脱蓝色的背景,而是保持UILabel
的高亮颜色?
你可以这样做,如下所示。 将你的表格单元格的select样式设置为UITableViewCellSelectionStyleNone
。 这将删除蓝色背景突出显示。 然后,为了使文本标签突出显示按照您想要的方式工作,而不是使用默认的UITableViewCell类,请创buildUITableViewCell
的子类并覆盖setHighlighted:animated
的默认实现setHighlighted:animated
使用您自己的实现设置setHighlighted:animated
,然后将标签颜色设置为在突出显示的状态。
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if (highlighted) { self.textLabel.textColor = [UIColor whiteColor]; } else { self.textLabel.textColor = [UIColor blackColor]; } }
如果在iOS7之前工作,使您的单元格select样式没有
cell.selectionStyle = UITableViewCellSelectionStyleNone;
否则,由UITableViewCellSelectionStyleDefault
保留
然后:
UIView *selectedView = [[UIView alloc]init]; selectedView.backgroundColor = [UIColor redColor]; cell.selectedBackgroundView = selectedView;
此代码将正常工作
将select样式设置为none之后,可以使用以下委托方法:
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
像这样在这里实现你的代码
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath]; [cell.lbls setTextColor:[UIColor whiteColor]]; return indexPath; }
在cellForRowAtIndexPath中使用这个代码:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels
希望这会为你工作。
享受编码:)
为了得到这个工作,你必须将select样式设置为UITableViewCellSelectionStyleNone
,然后你应该重写方法setSelected:animated:
得到你想要的结果。 当您看到蓝色(或灰色)select时,它会执行与iOS自动select机制相同的操作。
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { if (selected) { self.textLabel.textColor = [UIColor whiteColor]; } else { self.textLabel.textColor = [UIColor blackColor]; } }
您也可以通过其他方式来自定义它,例如通过更改UITableViewCell背景等。
在你的UITableViewCell
的子类中覆盖下面的函数。
override func setHighlighted(highlighted: Bool, animated: Bool) { } override func setSelected(selected: Bool, animated: Bool) { }
为了匹配标准的select风格行为,你需要覆盖setHighlighted:animated:
和setSelected:animated:
setHighlighted:animated:
您可能需要将该代码移到共享方法中,以避免重复的代码。
override func setHighlighted(highlighted: Bool, animated: Bool) { setAsSelectedOrHighlighted(highlighted, animated: animated) super.setHighlighted(highlighted, animated: animated) } override func setSelected(selected: Bool, animated: Bool) { setAsSelectedOrHighlighted(selected, animated: animated) super.setSelected(selected, animated: animated) } func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) { let action = { // Set animatable properties } if animated { UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil) } else { action() } }
在你的自定义单元中,重写awakeFromNib&setSelected的默认实现:
- (void)awakeFromNib { // Initialization code UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds]; imageView.image = [UIImage imageNamed:@"cell_selected_img"]; self.selectedBackgroundView = imageView; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state if (selected) { self.lblCustomText.textColor = [UIColor whiteColor]; } else { self.lblCustomText.textColor = [UIColor blackColor]; } }
还要确保select样式 未设置为无 。
我能得到它的唯一方法是:
- (void)awakeFromNib { UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0]; bgColorView.layer.masksToBounds = YES; self.selectedBackgroundView = bgColorView; }