UITableViewCell突出显示标签的背景

我有UITableViewCell上的UIlabel,我已经编程创build(即不是一个笔尖或子类)。

当单元格突出显示(变为蓝色)时,会使UILabels的所有背景颜色变清晰。 我有2 UILabels,我不希望这是事实。 目前,我在UILabel后面使用UIImageView,使其看起来像背景颜色不会改变。 但是,这似乎是一个低效的方法来做到这一点。

当UITableViewCell突出显示时,如何停止某些UILabel的背景颜色变化?

另一种保持背景颜色突出显示的方法是在标签的layer而不是在标签上设置backgroundColor属性。

 #import <QuartzCore/QuartzCore.h> 

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Get a table cell UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:@"cell"]; // Set up the table cell cell.textLabel.text = @"This is a table cell."; // If you're targeting iOS 6, set the label's background color to clear // This must be done BEFORE changing the layer's backgroundColor cell.textLabel.backgroundColor = [UIColor clearColor]; // Set layer background color cell.textLabel.layer.backgroundColor = [UIColor blueColor].CGColor; return cell; } 

layer不受单元格突出显示或select的影响。

或者,您不想更改颜色的子标签:

 @interface PersistentBackgroundLabel : UILabel { } - (void)setPersistentBackgroundColor:(UIColor*)color; @end @implementation PersistentBackgroundLabel - (void)setPersistentBackgroundColor:(UIColor*)color { super.backgroundColor = color; } - (void)setBackgroundColor:(UIColor *)color { // do nothing - background color never changes } @end 

然后使用setPersistentBackgroundColor:来明确地设置颜色。 这将防止从任何地方的背景颜色变化,而无需使用自定义显式背景颜色更改方法。

这样做的好处是在转换过程中也可以消除标签中的清晰背景。

您需要inheritanceUITableViewCell并重写以下两个方法:

Objective-C的:

 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { UIColor *backgroundColor = self.myLabel.backgroundColor; [super setHighlighted:highlighted animated:animated]; self.myLabel.backgroundColor = backgroundColor; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { UIColor *backgroundColor = self.myLabel.backgroundColor; [super setSelected:selected animated:animated]; self.myLabel.backgroundColor = backgroundColor; } 

迅速

 override func setSelected(selected: Bool, animated: Bool) { let color = self.myLabel.backgroundColor super.setSelected(selected, animated: animated) self.myLabel.backgroundColor = color } override func setHighlighted(highlighted: Bool, animated: Bool) { let color = self.myLabel.backgroundColor super.setHighlighted(highlighted, animated: animated) self.myLabel.backgroundColor = color } 

我可能错了,但是我找不到直接覆盖Swift中现有的getter / setter。 构builduser479821的答案,我find了一个解决方法,似乎产生了预期的结果。 我添加了IBDesignable / IBInspectable注释以防使用情节提要,这是渲染在编辑器中的最终颜色。

 @IBDesignable class PersistentBackgroundLabel: UILabel { @IBInspectable var persistentBackgroundColor: UIColor = UIColor.clearColor() { didSet { super.backgroundColor = persistentBackgroundColor } } override var backgroundColor: UIColor? { didSet { if backgroundColor != persistentBackgroundColor { backgroundColor = persistentBackgroundColor } } } } 

我有同样的问题,我想这是一个UIKit框架错误。 感谢上帝我有一个解决方法:订单事宜! 只需按照以下顺序:

 - (void)tableView:(UITableView *)t willDisplayCell:(UITableViewCell*)c forRowAtIndexPath:(NSIndexPath *)i { UIColor *bgc = [UIColor redColor]; // Set up the cell in following order: c.textLabel.backgroundColor = bgc; c.backgroundColor = bgc; c.textLabel.text = @"foo"; } 

我不知道为什么,但这个序列工作正常,其他顺序使得它看起来好像c.textLabel.backgroundColor被强制clearColor在取消select一些单元格后。

这不是一个随机的行为,这是细胞第一次被重复使用,而不是在创build时,以及第二次被重用的时候。 有了解决方法它始终正常工作。

将背景颜色设置为label.layer.backgroundColor可以解决这个问题。

看起来单元格会在高亮显示时改变UILabel的backgroundColor。

我只是在UILabel子类中创build一个标志,以在awakeFromNib或init之后禁用背景颜色更改。 这允许故事板中的初始颜色设置生效。 我们不必调用任何额外的方法。

 @implementation MWPersistentBGLabel { BOOL disableBackgroundColorChange; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; [self setup]; } - (void)setup { // disable background color change after setup is called disableBackgroundColorChange = YES; } // if we ever have to change the color later on, we can do so with this method - (void)setPersistentBackgroundColor:(UIColor*)color { [super setBackgroundColor:color]; } - (void)setBackgroundColor:(UIColor *)color { if (!disableBackgroundColorChange) { [super setBackgroundColor:color]; } // do nothing - background color never changes } @end 

在我的应用程序,我不得不改变uitableviewcellselect风格的蓝色,所以我不得不设置uiimage视图,当我点击的单元格突出显示为Imageview。 当我回到视图时,我删除了单元格的突出显示。 我不能清楚地理解你的问题。 所以只要给我的代码,试试这个,

  cellForRowAtIndexPath Method: CGRect a=CGRectMake(0, 0, 300, 100); UIImageView *bImg=[[UIImageView alloc] initWithFrame:a]; bImg.image=[UIImage imageNamed:@"bg2.png"]; [bImg setContentMode:UIViewContentModeScaleToFill]; cell.selectedBackgroundView=bImg; [bImg release]; -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; NSIndexPath *deselect = [self.tableView indexPathForSelectedRow]; [self.tableView deselectRowAtIndexPath:deselect animated:NO]; } 

好运

我不得不inheritanceUItableView,创build一个我不希望透明背景的视图标签列表,并重写setHighlighted:animated:方法,以便重置特定的标签背景颜色。 如果只有我有源代码的UItableViewCell的实际的类,

我无法获得接受的工作答案; 不是我认为答案是不正确的(远非如此 – 这似乎是正确的方式),但是当我写第一个iOS应用程序时,我的脑袋已经与子类一起旋转了。 所以我决定作弊。

假设自定义单元格由TableViewCell类控制。 我创build了正确背景颜色的单个像素.png文件,并在我的自定义单元格中创build了一个UIImageView对象。 我使用属性检查器来设置默认图像,并使用“缩放填充”。 为了获得更多的视觉吸引力,我将以下内容添加到了Identity inspector中的User Defined Runtime Attributes:

 KeyPath Type Value layer.cornerRadius Number 4 layer.masksToBounds Boolean YES 

Voilá,廉价的圆angular。

直接位于UILabel之后,它看起来是业务,虽然它显然不会调整与内容(因为唯一的内容是它自己的形象)。 不是我的问题,因为要显示的数据必须是固定的大小。

在一些价值观上,有一个不同的颜色是很好的,可以很容易地设置:

 cell.deviceDetailBackground.image = [UIImage imageNamed:@"detailBackground2.png"]; 

其中'cell'是我使用TableViewCell *cell;创build的cellForRowAtIndexPath方法中自定义单元格的化身TableViewCell *cell; 。 没有数据显示?

 cell.deviceDetailBackground.image = nil; 

我确信这是一个愚蠢的想法会有一个很好的理由,但由于我刚开始使用iOS开发,这是一个简单的解决scheme,为我工作。 随意告诉我为什么不这样做!