如果我在分组的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)]
,但这也不起作用。
有什么想法吗?
答案 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 !!!