UITableViewCell重新排序会清除子视图的背景颜色

时间:2015-04-28 07:21:54

标签: ios objective-c iphone uitableview tableviewcell

这个问题已被问过几次,但似乎没有任何解决方案。

UITableView reorder hides background

Subviews of UITableViewCell are not visible while reordering

Reordering causing subview 's backround color to clear

我有一个带UILabel的自定义tableview单元格。当tableview处于编辑模式并且我拖动单元格以重新排序时,UILabel的背景变为清晰的颜色。我还发现,如果我尝试重新排序所选单元格(我的tableview允许在编辑模式下进行多次选择),则子视图的背景颜色会保留。

我在CustomCell中尝试了下面的方法,但是当拖动单元格时,它们都没有覆盖子视图的背景颜色。

我希望子视图的背景颜色保持不变。有没有我错过的方法?或者Apple以这种方式设计它?

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    if (selected) {
        if (self.isEditing) {
            self.customLabel.backgroundColor = [UIColor blueColor];
        }
        else {
            self.customLabel.backgroundColor = [UIColor blueColor];
        }
    }
    else {
            self.customLabel.backgroundColor = [UIColor blueColor];
    }
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        if (self.isEditing) {
            self.customLabel.backgroundColor = [UIColor blueColor];
        }
        else {
            self.customLabel.backgroundColor = [UIColor blueColor];
        }
    }
    else {
        self.customLabel.backgroundColor = [UIColor blueColor];
    }
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];

    if (editing) {
        self.customLabel.backgroundColor = [UIColor blueColor];
    }
    else {
        self.customLabel.backgroundColor = [UIColor blueColor];
    }
}

2 个答案:

答案 0 :(得分:4)

为Swift 3添加现代解决方案。

创建一个新的.swift文件并创建一个自定义的UIView类:

import UIKit

class NeverClearView: UIView {
    override var backgroundColor: UIColor? {
        didSet {
            if backgroundColor?.cgColor.alpha == 0 {
                backgroundColor = oldValue
            }
        }
    }
}

在Interface Builder中,转到Identity Inspector并将类设置为闪亮的新NeverClearView类。这将阻止它在细胞重新排序期间消失。

此解决方案也适用于其他UIKit组件,例如我不得不在一秒钟之前为UIStepper做同样的事情。

答案 1 :(得分:1)

您可以创建自定义UILabel。并重载-drawRect。

@interface VALAbel:UILabel
@property (nonatomic, strong) UIColor *bac_color;
@end


@implementation VALabel

-(void)setBac_color:(UIColor *)bac_color
{
_bac_color = bac_color;
[self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
   [self.bac_color set];

   CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), true);
   CGContextFillRect(UIGraphicsGetCurrentContext(), self.bounds);

    [super drawRect:rect];
 }
@end

这会对你有所帮助!