iOS:使用UIAppearance定义自定义UITableViewCell颜色

时间:2011-11-29 19:27:13

标签: ios uitableview

如果我在分组的UITableViewCell上设置backgroundColor属性,则背景颜色会成功更改。大。

但是我想使用UIAppearance来改变我所有UITableViewCells的背景颜色,所以我可以在一个地方完成它并影响到处的变化。这是我的代码:

[[UITableViewCell appearance] setBackgroundColor:[UIColor colorWithRed:30.0/255.0 green:30.0/255.0 blue:30.0/255.0 alpha:1.0]];

UITableViewCell实现了UIAppearance和UIAppearanceContainer,所以我认为这样可行。但事实并非如此。我也尝试使用-[UITableViewCell appearanceWhenContainedIn:(Class)],但这也不起作用。

有什么想法吗?

4 个答案:

答案 0 :(得分:41)

更新(2013/7/8) - 已在较新版本的iOS中修复此问题。但是,如果您的目标是iOS 6或更低版本,则值得了解。

你可以责怪苹果这个,它实际上是他们的意思。 技术上backgroundColor 无法通过外观代理进行自定义

来自Apple的文档:

  

要支持外观自定义,类必须符合UIAppearanceContainer协议,并且必须使用UI_APPEARANCE_SELECTOR标记相关的访问器方法。

如果我们进入类似UIBarButtonItem的课程并查看tintColor属性,我们会看到:

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

因为它标有UI_APPEARANCE_SELECTOR标记,我们知道它适用于UIAppearance

以下是Apple特别吝啬的地方:在UIView中,backgroundColor 没有外观选择器标记,但仍然适用于UIAppearance 。根据Apple提供的所有文档,它不应该,但它确实如此!

这给人一种误导性的印象,即它适用于UIView的所有子类,包括UITableView。这已经出现过,in this previous SO answer

所以最重要的是,backgroundColor根本不应与UIAppearance一起使用,但出于某种原因,它会在UIView上执行。它不能保证在UIView子类上工作,并且在UITableView上根本不起作用。对不起,我无法给你一个更积极的答案!

答案 1 :(得分:17)

您可以创建自己的符合UIAppearance的UITableViewCell子类,并使用UI_APPEARANCE_SELECTOR标记自定义setter。然后在自定义setter中设置超类上的单元格backgroundColor。

在你的appDelegate

[[CustomCell appearance] setBackgroundCellColor:[UIColor redColor]];

在您的UItableView子类

@interface CustomCell : UITableViewCell <UIAppearance>

@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR;

@implementation CustomCell

@synthesize backgroundCellColor;

-(void)setBackgroundCellColor:(UIColor *)backgroundColor
{
    [super setBackgroundColor:backgroundColor];
}

我在这个例子中使用ARC。

答案 2 :(得分:3)

没有子类化在子类上执行此操作可能不是最佳做法,特别是如果您想要点击所有tableView背景。这是很多子类化。很多潜在的错误。一团糟真的。最好的方法是使用类别。您必须为tableViewCell和tableView设置一个。我将只展示一个细胞。您必须在tableView上执行的属性是backgroundColor属性。 NB。我正在用“sat”开始我的方法。

// .h

    #import <UIKit/UIKit.h>

@interface UITableViewCell (Appearance)<UIAppearance>
@property (strong, nonatomic) UIColor *satBackgroundColor UI_APPEARANCE_SELECTOR;
@end

// .m

#import "UITableViewCell+Appearance.h"

@implementation UITableViewCell (Appearance)

- (UIColor *)satBackgroundColor
{
    return self.backgroundColor;
}

- (void)setSatBackgroundColor:(UIColor *)satBackgroundColor
{
    self.backgroundColor = satBackgroundColor;
}


@end

现在在您的appDelegate或某个经理类中,您将导入该类别,只需将其称为内置外观代理即可。

UITableViewCell *cell = [UITableViewCell appearance];
cell.satBackgroundColor = [UIColor orangeColor];

好的,现在只需为tableView的background属性做一个。简单。

答案 3 :(得分:0)

我为此使用了类别。下面是示例代码 在你的.h文件中写

*@interface UITableViewCell (MyCustomCell)
@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR;
@end*

在你的.m文件中写

*@dynamic backgroundCellColor;
-(void)setBackgroundCellColor:(UIColor *)backgroundColor
{
    [super setBackgroundColor:backgroundColor];
}*

对我来说效果很好。 :) 谢谢Nate !!!