【问题标题】:iOS: Using UIAppearance to define custom UITableViewCell coloriOS:使用 UIAppearance 定义自定义 UITableViewCell 颜色
【发布时间】:2012-01-09 03:12:57
【问题描述】:

如果我在一个分组的 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)],也不管用。

有什么想法吗?

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

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

    您可以为此责怪 Apple,这实际上对他们很刻薄。 技术上backgroundColor 不能通过外观代理自定义

    来自 Apple 的文档:

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

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

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

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

    这里是苹果特别刻薄的地方:在UIView 中,backgroundColor 没有外观选择器标签,但仍然适用于UIAppearance。根据 Apple 提供的所有文档,它不应该提供它,但它确实提供了!

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

    所以底线是backgroundColor 根本不应该与UIAppearance 一起工作,但由于某种原因它可以在UIView 上工作。它不能保证在UIView 子类上工作,它在UITableView 上根本不起作用。对不起,我不能给你更积极的答案!

    【讨论】:

    • 感谢您的解释。因为这个,我可能会花几个小时把头靠在墙上。
    • 如果这真的让您感到困扰(它让我感到困扰!),请务必向 Apple 提交错误报告。我不认为它本身真的是一个“错误”,但它绝对是一个缺陷。我想我什至可能见过 Apple 的某个人在外观代理上的代码演示中使用 setBackgroundColor
    • @lxt:我正在查看 iOS 7,但没有看到它已修复。你能不能给我发一封电子邮件(我的电子邮件地址)来讨论。我了解 iOS 7 仍处于 NDA 状态,因此您不想在此处提供信息,直到它可用为止。
    • @VictorRonin - 你在看UITableViewCell 头文件吗?
    • @lxt:是的。并且只有 UI_APPEARANCE_SELECTOR 标记的东西(它不是背景)。
    【解决方案2】:

    您可以创建自己的符合 UIAppearance 的 UITableViewCell 子类,并使用 UI_APPEARANCE_SELECTOR 标记自定义设置器。然后通过自定义设置器在 superlass 上设置单元格 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。

    【讨论】:

    • 即使没有子类化,您也可以使用类别和自定义属性来代理外观调用。如果您想为无法使用子类的部分设置主题(例如 UIPrintInteractionController),它会很有用。
    【解决方案3】:

    没有子类化在子类上执行此操作可能不是最佳做法,尤其是如果您想点击所有 tableView 背景。这是很多子类化。很多潜在的错误。真是一团糟。最好的方法是使用类别。您必须为 tableViewCell 和 tableView 设置一个。我将只演示用于单元格的那个。 tableView 上你必须做的属性是 backgroundColor 属性。注意。我在我的方法前面加上“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 的背景属性做一个。很简单。

    【讨论】:

      【解决方案4】:

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

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

      在你的 .m 文件中写入

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 2012-10-05
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        相关资源
        最近更新 更多