我正在开发一个 iPhone 应用程序,在我的表格视图中,我想要单元格选择样式的自定义颜色,我阅读了UITableViewCell 类参考,但是为选择样式定义了三个常量(蓝色、灰色、无)。我看到一个应用程序使用了与参考中定义的颜色不同的颜色。
我们如何使用参考中定义的颜色以外的颜色?
提前致谢。
我正在开发一个 iPhone 应用程序,在我的表格视图中,我想要单元格选择样式的自定义颜色,我阅读了UITableViewCell 类参考,但是为选择样式定义了三个常量(蓝色、灰色、无)。我看到一个应用程序使用了与参考中定义的颜色不同的颜色。
我们如何使用参考中定义的颜色以外的颜色?
提前致谢。
设置选择的最佳方法是selectedBackgroundView
在构建单元格时设置它。
IE
- (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
}
使用的图像应该有一个很好的渐变(如默认选择)。如果你只想要一个平面颜色,你可以使用 UIView 而不是 aUIImageView
并将 设置为backgroundColor
你想要的颜色。
然后在选择行时自动应用此背景。
当设置为时,设置selectedBackgroundView
似乎没有效果。当我不设置样式时,只使用默认的灰色。 cell.selectionStyle
UITableViewCellSelectionStyleNone
使用将自定义插入单元格的第一个建议UIView
确实会操纵单元格,但是当单元格被触摸时它不会显示,只有在选定的操作完成后才显示,因为我正在推动新视图,所以为时已晚。如何在选定操作开始之前显示单元格中的选定视图?
如果您已将 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
我尝试了上面的一些方法,实际上我更喜欢创建自己的 UITableViewCell 子类,然后覆盖 touchesBegan/touchesCancelled/touchesEnded 方法。为此,请忽略单元格上的所有 selectedBackgroundView 和 highlightColor 属性,而是在调用上述方法之一时手动设置这些颜色。例如,如果您想将单元格设置为具有红色文本的绿色背景,请尝试以下操作(在您的自定义单元格子类中):
- (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;
否则,您将首先获得当前的选择样式。
编辑:我建议使用 touchesCancelled 方法恢复到原始单元格颜色,但忽略 touchesEnded 方法。
覆盖 didSelectRowAtIndexPath: 并绘制您选择的颜色的 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
}
您可以选择在取消选择此视图时对其进行动画处理并满足您的要求。
子类 UITableViewCell 和覆盖setHighlighted:animated:
您可以通过设置 backgroundColor 来定义自定义选择颜色颜色(请参阅 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;
}
要添加自定义颜色,请使用以下代码。并使其透明使用alpha: 0.0
cell.selectedBackgroundView = UIView(frame: CGRect.zero)
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0)
如果您使用自定义颜色并希望给它圆角外观,请使用:
cell.layer.cornerRadius = 8
此外,使用它以获得更好的动画和感觉
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}