UITableViewCell在突出显示时使标签的背景清晰

时间:2010-06-03 10:33:30

标签: iphone objective-c uitableview uilabel background-color

我在UITableViewCell上有一个UIlabel,我是以编程方式创建的(即不是nib或子类)。

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

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

10 个答案:

答案 0 :(得分:50)

您需要继承UITableViewCell并覆盖以下两种方法:

<强>目标-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
}

答案 1 :(得分:46)

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

#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不受细胞突出显示或选择的影响。

答案 2 :(得分:39)

或者将您不想更改颜色的标签子类化:

@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:显式设置颜色:这样可以防止在任何地方更改背景颜色,而无需使用自定义显式背景颜色更改方法。

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

答案 3 :(得分:5)

我可能会弄错,但我无法直接覆盖Swift中现有的getter / setter。基于user479821的答案,我找到了一种似乎可以产生预期结果的解决方法。我添加了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
        }
    }
    }
}

答案 4 :(得分:3)

我遇到了同样的问题,我猜这是一种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。

这不是随机行为,它发生在第一次重复使用细胞时,而不是在它们被创建时,也不是第二次重复使用时。通过解决方法,它始终可以正常工作。

答案 5 :(得分:2)

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

当突出显示时,细胞似乎会改变UILabel的backgroundColor。

答案 6 :(得分:1)

我只是在UILabel子类中创建一个标志,以在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

答案 7 :(得分:0)

在我的应用程序中,我不得不更改uitableviewcell选择样式的蓝色,所以我必须设置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];

   }

祝你好运

答案 8 :(得分:0)

我必须子类化UItableView,创建一个我想不透明背景的视图标签列表,并覆盖setHighlighted:animated:方法,以便重置特定标签背景颜色。 longwinding和fidely,如果我只有源代码t UItableViewCell的实际类。

答案 9 :(得分:-1)

我无法得到公认的工作答案;不是我认为答案是不正确的(远离它 - 这似乎是正确的方式),但在我编写我的第一个iOS应用程序时,我的脑袋已经旋转了子类。所以我决定作弊。

假设自定义单元格由TableViewCell类控制。我创建了一个正确背景颜色的单个像素.png文件,并在我的自定义单元格中创建了一个UIImageView对象。我使用“属性”检查器设置默认图像并使用“缩放到填充”。为了更具视觉吸引力,我在身份检查器中将以下内容添加到用户定义的运行时属性中:

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

Voilá,便宜的圆角。

直接位于UILabel后面,它看起来像是商业,虽然它显然不会随内容调整大小(因为唯一的内容是它自己的图像)。对我来说不是问题,因为要显示的数据无论如何都必须是固定大小。

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

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

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

cell.deviceDetailBackground.image = nil;

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