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

Gre*_*tic 22 uitableview ios

如果我在分组的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]];
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

lxt*_*lxt 42

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

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

来自Apple的文档:

为了支持外观定制,类必须符合UIAppearanceContainer协议和相关的访问方法必须注明UI_APPEARANCE_SELECTOR.

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

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;
Run Code Online (Sandbox Code Playgroud)

所以因为它标有UI_APPEARANCE_SELECTOR标签,我们知道它可以使用UIAppearance.

这里是Apple特别吝啬的地方:在a中UIView,backgroundColor 没有外观选择器标签,但仍可使用UIAppearance.根据Apple提供的所有文档,它不应该,但它确实如此!

这给人一种误导性的印象,即它适用于所有子类UIView,包括UITableView.在之前的SO回答中,这已经出现了

所以最重要的是,backgroundColor根本不应该使用UIAppearance,但由于某种原因,它确实在a UIView.它不能保证在UIView子类上工作,它根本不起作用UITableView.对不起,我不能给你一个更积极的答案!


Nat*_*ter 17

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

在你的appDelegate中

[[CustomCell appearance] setBackgroundCellColor:[UIColor redColor]];
Run Code Online (Sandbox Code Playgroud)

在您的UItableView子类中

@interface CustomCell : UITableViewCell <UIAppearance>

@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR;
Run Code Online (Sandbox Code Playgroud)
@implementation CustomCell

@synthesize backgroundCellColor;

-(void)setBackgroundCellColor:(UIColor *)backgroundColor
{
    [super setBackgroundColor:backgroundColor];
}
Run Code Online (Sandbox Code Playgroud)

我在这个例子中使用ARC.