UITableView单元格select颜色?

我创build了一个自定义的UITableViewCell 。 表格视图显示数据正常。 我卡住的是当用户触摸tableview单元格,然后我想显示单元格的背景颜色,而不是默认的[蓝色]值突出显示单元格的select。 我使用这个代码,但没有任何反应:

 cell.selectedBackgroundView.backgroundColor=[UIColor blackColor]; 

我认为你是在正确的轨道上,但根据selectedBackgroundView的类定义:

对于普通样式表(UITableViewStylePlain)中的单元格,默认值为零,对于部分表格UITableViewStyleGrouped,则默认值为零。

因此,如果您使用的是简单样式表,那么您需要alloc-init一个具有所需背景色的新UIView ,然后将其分配给selectedBackgroundView

或者,您可以使用:

 cell.selectionStyle = UITableViewCellSelectionStyleGray; 

如果所有你想要的是单元格被选中时的灰色背景。 希望这可以帮助。

不需要定制单元格。 如果您只想更改单元格的选定颜色,可以这样做:

Objective-C的:

 UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor redColor]; [cell setSelectedBackgroundView:bgColorView]; 

迅速:

 let bgColorView = UIView() bgColorView.backgroundColor = UIColor.redColor() cell.selectedBackgroundView = bgColorView 

Swift 3:

 let bgColorView = UIView() bgColorView.backgroundColor = UIColor.red cell.selectedBackgroundView = bgColorView 

编辑:更新为ARC

编辑:添加Swift 3

如果你有一个每个部分只有一个单元格的分组表,只需在代码中join这一行: bgColorView.layer.cornerRadius = 10;

 UIView *bgColorView = [[UIView alloc] init]; [bgColorView setBackgroundColor:[UIColor redColor]]; bgColorView.layer.cornerRadius = 10; [cell setSelectedBackgroundView:bgColorView]; [bgColorView release]; 

不要忘记导入QuartzCore。

以下在iOS 8中适用于我。

我必须将select样式设置为UITableViewCellSelectionStyleDefault自定义背景颜色才能工作。 如果有其他样式,自定义背景颜色将被忽略。 行为似乎有所改变,因为以前的答案需要将样式设置为无。

单元格的完整代码如下所示:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"MyCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } // This is how you change the background color cell.selectionStyle = UITableViewCellSelectionStyleDefault; UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor redColor]; [cell setSelectedBackgroundView:bgColorView]; return cell; } 

为你的表格单元格和自定义单元格class.m创build一个自定义的单元格,将代码放在下面,它将正常工作。 您需要将所需的彩色图像放在selectionBackground UIImage中。

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"]; UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground]; self.selectedBackgroundView=iview; } 

Swift 3:对于我来说,当你把它放在cellForRowAtIndexPath:方法中的时候它就起作用了

 let view = UIView() view.backgroundColor = UIColor.red cell.selectedBackgroundView = view 

表格视图单元格select背景颜色可以通过故事板设置:

表格视图单元格选择颜色无

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIView *view = [[UIView alloc] init]; [view setBackgroundColor:[UIColor redColor]]; [cell setSelectedBackgroundView:view]; } 

我们需要在这个方法中设置选定的背景视图。

如果你想添加一个自定义的高亮颜色到你的单元格(和你的单元格包含button,标签,图像等)。我按照下面的步骤:

例如,如果你想要一个选定的黄色:

1)创build一个适合所有具有20%不透明度(黄色)的单元格的视图,例如backgroundSelectedView

2)在单元控制器写这个:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { self.backgroundselectedView.alpha=1; [super touchesBegan:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { self.backgroundselectedView.alpha=0; [super touchesEnded:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { self.backgroundSelectedImage.alpha=0; [super touchesCancelled:touches withEvent:event]; } 

如果您使用的是自定义的TableViewCell,那么也可以重写awakeFromNib

 override func awakeFromNib() { super.awakeFromNib() // Set background color let view = UIView() view.backgroundColor = UIColor.redColor() selectedBackgroundView = view } 

另外一个技巧是基督教的方式来显示分组表格的圆angular背景。

如果我使用cornerRadius = 10作为单元格,它会显示四个angular的圆angularselect背景。 这与表格视图的默认UI不一样。

所以,我想用cornerRadius解决它的简单方法。 从下面的代码可以看出,检查单元格的位置(顶部,底部,中间或顶部),并添加一个子图层来隐藏顶部angular落或底部angular落。 这只是显示与默认表视图的select背景完全相同的外观。

我用iPad分割器视图testing了这个代码。 您可以根据需要更改patchLayer的帧位置。

请让我知道是否有更简单的方法来达到相同的结果。

 if (tableView.style == UITableViewStyleGrouped) { if (indexPath.row == 0) { cellPosition = CellGroupPositionAtTop; } else { cellPosition = CellGroupPositionAtMiddle; } NSInteger numberOfRows = [tableView numberOfRowsInSection:indexPath.section]; if (indexPath.row == numberOfRows - 1) { if (cellPosition == CellGroupPositionAtTop) { cellPosition = CellGroupPositionAtTopAndBottom; } else { cellPosition = CellGroupPositionAtBottom; } } if (cellPosition != CellGroupPositionAtMiddle) { bgColorView.layer.cornerRadius = 10; CALayer *patchLayer; if (cellPosition == CellGroupPositionAtTop) { patchLayer = [CALayer layer]; patchLayer.frame = CGRectMake(0, 10, 302, 35); patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR; [bgColorView.layer addSublayer:patchLayer]; } else if (cellPosition == CellGroupPositionAtBottom) { patchLayer = [CALayer layer]; patchLayer.frame = CGRectMake(0, 0, 302, 35); patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR; [bgColorView.layer addSublayer:patchLayer]; } } } 

我想要注意的是,XIB编辑器提供了以下标准选项:

部分:蓝/灰/无

(具有选项的右栏,第四选项卡,第一组“表格视图单元”,第四小组,第三项中的第一项select“select”)

也许你想要做的可能是通过select正确的标准选项来实现。

根据UITableView的选定单元格的自定义颜色,按照Maciej Swic的答案 ,这是一个很好的解决scheme

为了补充一点,你通常在Cellconfiguration中声明Swic的答案 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

而为了增加效果,而不是系统颜色,可以将RGB值用于自定义颜色外观。 在我的代码中,我是这样实现的:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath } static NSString *CellIdentifier = @"YourCustomCellName"; MakanTableCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // Configure the cell... if (cell == nil) { cell = [[[NSBundle mainBundle]loadNibNamed:@"YourCustomCellClassName" owner:self options:nil]objectAtIndex:0]; } UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor colorWithRed:255.0/256.0 green:239.0/256.0 blue:49.0/256.0 alpha:1]; bgColorView.layer.cornerRadius = 7; bgColorView.layer.masksToBounds = YES; [cell setSelectedBackgroundView:bgColorView]; return cell; } 

让我知道这是否也适合你。 您可以在所选单元格的angular落处cornerRadiusangular落cornerRadius数字。

我已经有了一个与其他人不同的方法来反映select,而不是被选中。 我有一个子类UITableViewCell。 您只需在触摸事件中设置背景色,模拟触摸上的select,然后在setSelected函数中设置背景色。 在selSelected函数中设置背景色可以取消select单元格。 确保将触摸事件传递给super,否则单元格实际上不会像选中一样。

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { self.backgroundColor = UIColor(white: 0.0, alpha: 0.1) super.touchesBegan(touches, withEvent: event) } override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) { self.backgroundColor = UIColor.clearColor() super.touchesCancelled(touches, withEvent: event) } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state self.backgroundColor = selected ? UIColor(white: 0.0, alpha: 0.1) : UIColor.clearColor() } 

为所有单元格添加背景(使用Maciej的答案):

 for (int section = 0; section < [self.tableView numberOfSections]; section++) { for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) { NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section]; UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath]; //stuff to do with each cell UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor redColor]; [cell setSelectedBackgroundView:bgColorView]; } } 

对于Swift 3.0:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = super.tableView(tableView, cellForRowAt: indexPath) cell.contentView.backgroundColor = UIColor.red } 

以下是分组表所需的代码的重要部分。 当一个部分中的任何单元格被选中时,第一行将改变颜色。 在没有初始设置cellselectionstyle为none的情况下,当用户单击row0(其中单元格更改为bgColorView)然后淡入淡出并重新加载bgColorView时,会有双重重新加载。 好运气,让我知道是否有一个更简单的方法来做到这一点。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } if ([indexPath row] == 0) { cell.selectionStyle = UITableViewCellSelectionStyleNone; UIView *bgColorView = [[UIView alloc] init]; bgColorView.layer.cornerRadius = 7; bgColorView.layer.masksToBounds = YES; [bgColorView setBackgroundColor:[UIColor colorWithRed:.85 green:0 blue:0 alpha:1]]; [cell setSelectedBackgroundView:bgColorView]; UIColor *backColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1]; cell.backgroundColor = backColor; UIColor *foreColor = [UIColor colorWithWhite:1 alpha:1]; cell.textLabel.textColor = foreColor; cell.textLabel.text = @"row0"; } else if ([indexPath row] == 1) { cell.selectionStyle = UITableViewCellSelectionStyleNone; UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; cell.backgroundColor = backColor; UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; cell.textLabel.textColor = foreColor; cell.textLabel.text = @"row1"; } else if ([indexPath row] == 2) { cell.selectionStyle = UITableViewCellSelectionStyleNone; UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; cell.backgroundColor = backColor; UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; cell.textLabel.textColor = foreColor; cell.textLabel.text = @"row2"; } return cell; } #pragma mark Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:[indexPath section]]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:path]; [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; [tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone]; } - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tvStat cellForRowAtIndexPath:indexPath]; [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; } #pragma mark Table view Gestures -(IBAction)singleTapFrom:(UIGestureRecognizer *)tapRecog { CGPoint tapLoc = [tapRecog locationInView:tvStat]; NSIndexPath *tapPath = [tvStat indexPathForRowAtPoint:tapLoc]; NSIndexPath *seleRow = [tvStat indexPathForSelectedRow]; if([seleRow section] != [tapPath section]) [self tableView:tvStat didDeselectRowAtIndexPath:seleRow]; else if (seleRow == nil ) {} else if([seleRow section] == [tapPath section] || [seleRow length] != 0) return; if(!tapPath) [self.view endEditing:YES]; [self tableView:tvStat didSelectRowAtIndexPath:tapPath]; } 

重写UITableViewCellsetSelected也可以。

 override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Set background color let view = UIView() view.backgroundColor = UIColor.redColor() selectedBackgroundView = view } 

对于那些只想摆脱默认select的灰色背景的人把这行代码放在你的cellForRowAtIndexPath func中:

 yourCell.selectionStyle = .None 

我使用下面的方法,并为我工作得很好,

 class MyTableViewCell : UITableViewCell { var defaultStateColor:UIColor? var hitStateColor:UIColor? override func awakeFromNib(){ super.awakeFromNib() self.selectionStyle = .None } // if you are overriding init you should set selectionStyle = .None override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if let hitColor = hitStateColor { self.contentView.backgroundColor = hitColor } } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { if let defaultColor = defaultStateColor { self.contentView.backgroundColor = defaultColor } } override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { if let defaultColor = defaultStateColor { self.contentView.backgroundColor = defaultColor } } } 

在自定义单元类的情况下。 刚刚覆盖:

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state if (selected) { [self setBackgroundColor: CELL_SELECTED_BG_COLOR]; [self.contentView setBackgroundColor: CELL_SELECTED_BG_COLOR]; }else{ [self setBackgroundColor: [UIColor clearColor]]; [self.contentView setBackgroundColor: [UIColor clearColor]]; } } 

Swift 3.0扩展

 extension UITableViewCell { var selectionColor: UIColor { set { let view = UIView() view.backgroundColor = newValue self.selectedBackgroundView = view } get { return self.selectedBackgroundView?.backgroundColor ?? UIColor.clear } } } 

cell.selectionColor = UIColor.FormaCar.blue

当表视图风格很简单时,很容易,但在组风格,这是有点麻烦,我解决它:

 CGFloat cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kGroupTableViewCellWidth+2, cellHeight)]; view.backgroundColor = kCommonHighlightedColor; cell.selectedBackgroundView = view; [view release]; UIRectCorner cornerFlag = 0; CGSize radii = CGSizeMake(0, 0); NSInteger theLastRow = --> (yourDataSourceArray.count - 1); if (indexPath.row == 0) { cornerFlag = UIRectCornerTopLeft | UIRectCornerTopRight; radii = CGSizeMake(10, 10); } else if (indexPath.row == theLastRow) { cornerFlag = UIRectCornerBottomLeft | UIRectCornerBottomRight; radii = CGSizeMake(10, 10); } UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:cornerFlag cornerRadii:radii]; CAShapeLayer *shapeLayer = [CAShapeLayer layer]; shapeLayer.path = maskPath.CGPath; view.layer.mask = shapeLayer; 

注意到kGroupTableViewCellWidth,我将其定义为300,它是iPhone中组表格视图宽度的宽度

 [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 

确保你已经使用上面的行来使用select效果

 override func setSelected(selected: Bool, animated: Bool) { // Configure the view for the selected state super.setSelected(selected, animated: animated) let selView = UIView() selView.backgroundColor = UIColor( red: 5/255, green: 159/255, blue:223/255, alpha: 1.0 ) self.selectedBackgroundView = selView } 

我正在使用iOS 9.3并通过故事板设置颜色或设置cell.selectionStyle没有为我工作,但下面的代码工作:

 UIView *customColorView = [[UIView alloc] init]; customColorView.backgroundColor = [UIColor colorWithRed:55 / 255.0 green:141 / 255.0 blue:211 / 255.0 alpha:1.0]; cell.selectedBackgroundView = customColorView; return cell; 

我在这里find这个解决scheme

尝试下面的代码。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[cellIdArray objectAtIndex:indexPath.row] forIndexPath:indexPath]; // Configure the cell... cell.backgroundView = [[UIImageView alloc] init] ; cell.selectedBackgroundView =[[UIImageView alloc] init]; UIImage *rowBackground; UIImage *selectionBackground; rowBackground = [UIImage imageNamed:@"cellBackgroundDarkGrey.png"]; selectionBackground = [UIImage imageNamed:@"selectedMenu.png"]; ((UIImageView *)cell.backgroundView).image = rowBackground; ((UIImageView *)cell.selectedBackgroundView).image = selectionBackground; return cell; } 

// Swift版本:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell cell.selectedBackgroundView = UIImageView() cell.backgroundView=UIImageView() let selectedBackground : UIImageView = cell.selectedBackgroundView as! UIImageView selectedBackground.image = UIImage.init(named:"selected.png"); let backGround : UIImageView = cell.backgroundView as! UIImageView backGround.image = UIImage.init(named:"defaultimage.png"); return cell } 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView reloadData]; UITableViewCell *cell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; [cell setBackgroundColor:[UIColor orangeColor]]; } 

使用[cell setClipsToBounds:YES]; 分组样式单元格