如何将UITableViewCellSelectionStyle属性设置为某种自定义颜色?

我正在开发一个iPhone应用程序,在我的表格视图中,我想单元格select样式的自定义颜色,我读了UITableViewCell类参考,但只有三个常量为select样式(蓝色,灰色,无)定义。 我看到一个应用程序使用了不同于参考文献中定义的颜色。

我们如何使用参考文献中定义的颜色以外的颜色?

提前致谢。

设置select的最佳方法是在构build单元格时将selectedBackgroundView设置在单元格上。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; } // configure the cell } 

使用的图像应该有一个很好的渐变(如默认select)。 如果你只是想要一个平坦的颜色,你可以使用UIView而不是UIImageView ,并将backgroundColor设置为你想要的颜色。

当select该行时,此背景将自动应用。

cell.selectionStyle设置为UITableViewCellSelectionStyleNone时,设置selectedBackgroundView似乎没有效果。 当我不设置的风格只是使用默认的灰色。

使用将自定义UIView插入到单元格中的第一个build议操作单元格,但是单元格被触摸时不会显示,只有在选定的操作完成后才会显示,因为我正在推送到新的视图。 在选定的操作开始之前,如何让单元格中的选定视图显示?

如果你有一个UITableViewCell的子类,那么你可以通过覆盖以下内容来自定义单元的各个元素:

 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted) { self.backgroundColor = [UIColor redColor]; } else { self.backgroundColor = [UIColor clearColor]; } [super setHighlighted:highlighted animated:animated]; } 

编辑iOS7:正如Sasho所说,你也需要

 cell.selectionStyle = UITableViewCellSelectionStyleNone 

我尝试了上面的一些, 我更喜欢创build我自己的UITableViewCell的子类,然后重写touchesBegan / touchesCancelled / touchesEnded方法 。 为此,请忽略单元格上的所有selectedBackgroundView和highlightedColor属性,而只需在调用上述方法之一时手动设置这些颜色。 例如,如果要将单元格设置为具有红色文本的绿色背景,请尝试以下操作(在您的自定义单元格子类中):

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //Set backgorund self.backgroundColor = [UIColor themeBlue]; //Set text self.textLabel.textColor = [UIColor themeWhite]; //Call super [super touchesBegan:touches withEvent:event]; } 

请注意,为了这个工作,你需要设置:

 self.selectionStyle = UITableViewCellSelectionStyleNone; 

否则,你将首先得到当前的select风格。

编辑:我build议使用touchesCancelled方法恢复到原来的单元格颜色,但只是忽略touchesEnded方法。

覆盖didSelectRowAtIndexPath:并绘制一个你select的颜色的UIView,并将其插入单元格内的UILabel后面。 我会做这样的事情:

 UIView* selectedView; //inside your header - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; selectedView = [[UIView alloc] initWithFrame:[cell frame]]; selectedView.backgroundColor = [UIColor greenColor]; //whatever [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary [selectedView release]; //clean up } 

您可以select在取消选中时为此视图制作animation,并且可以满足您的要求。

Sublcass UITableViewCell并覆盖setHighlighted:animated:

您可以通过设置backgroundColor来定义自定义select颜色的颜色(请参阅WIllster的答案):

 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted) { self.backgroundColor = [UIColor redColor]; } else { self.backgroundColor = [UIColor clearColor]; } [super setHighlighted:highlighted animated:animated]; } 

您可以通过设置backgroundView属性来定义自定义背景图片:

 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if( highlighted == YES ) self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; else self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; [super setHighlighted:highlighted animated:animated]; } 
 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { // Set Highlighted Color if (highlighted) { self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; } else { self.backgroundColor = [UIColor clearColor]; } } 
 - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { // Add your Colour. SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour } - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { // Reset Colour. SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; [self setCellColor:Ripple_Colour ForCell:cell]; //normal color } - (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { cell.contentView.backgroundColor = color; cell.backgroundColor = color; }