我在UITableViewCell上有一个UIlabel,我是以编程方式创建的(即不是nib或子类)。
当单元格突出显示(变为蓝色)时,它会使UILabels的所有背景颜色变为清晰。我有2个UILabels,我不希望这样。 目前我在UILabel后面使用UIImageViews使它看起来像背景颜色不会改变。但这似乎是一种效率低下的方法。
当UITableViewCell突出显示时,如何停止某些UILabel的背景颜色变化?
答案 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开发,这是一个简单的解决方案,对我有用。随意告诉我为什么不这样做!