151

我正在尝试更改 UITableViewHeaderFooterView 的背景颜色。尽管视图正在出现,但背景颜色仍然是默认颜色。我从 xcode 得到一个日志说:

在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改用 contentView.backgroundColor。

但是,以下选项均无效:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

我还尝试更改 xib 文件中视图的背景颜色。

有什么建议么?谢谢。

4

20 回答 20

215

iOS 8、9、10、11...

设置任何颜色(使用任何 alpha)的唯一方法是使用backgroundView

迅速

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

对象-C

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

对评论的回应

  • 这些其他选项都不能可靠地工作(尽管有以下评论)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • backgroundView自动调整大小。(无需添加约束)

  • UIColor(white: 0.5, alpha: 0.5)用或控制 alpha backgroundView.alpha = 0.5
    (当然,任何颜色都可以)

  • 使用XIB时,使根视图 aUITableViewHeaderFooterView并以backgroundView编程方式关联:

    注册:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")
    

    加载:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }
    

演示

↻ 重播动画

► 在GitHub 上找到此解决方案,并在Swift Recipes上找到更多详细信息。

于 2014-08-31T04:00:54.847 回答
119

您应该使用myTableViewHeaderFooterView.tintColor或分配自定义背景视图给myTableViewHeaderFooterView.backgroundView.

于 2013-03-24T22:43:39.140 回答
26

在 iOS 7contentView.backgroundColor中为我工作,tintColor没有。

   headerView.contentView.backgroundColor = [UIColor blackColor];

虽然clearColor对我不起作用,但我找到的解决方案是将 backgroundView属性设置为透明图像。也许它会帮助某人:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
于 2014-04-30T14:38:31.113 回答
17

确保contentView为您设置了 backgroundColor UITableViewHeaderFooterView

self.contentView.backgroundColor = [UIColor whiteColor];

然后它将起作用。

于 2014-12-15T10:05:36.893 回答
15

对我来说,我尝试了上述所有方法,但仍然收到警告“在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改用 contentView.backgroundColor。” 然后我尝试了这个:在 xib 文件中,标题视图的背景颜色被选择为清除颜色而不是默认颜色,一旦我将其更改为默认值,警告就消失了。 这是

改成这个

于 2017-06-19T17:12:57.060 回答
12

对于纯色背景色,设置contentView.backgroundColor应该就足够了:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

对于具有透明度的颜色,包括.clear颜色,这不再有效:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work 
    }
}

对于完全透明的部分标题,将backgroundView属性设置为空视图:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

但是,请注意可能的副作用。除非表格视图设置为“分组”,否则当向下滚动时,部分标题将在顶部对齐。如果部分标题是透明的,则单元格内容将被看穿,这可能看起来不太好。

在这里,节标题具有透明背景:

在此处输入图像描述

为了防止这种情况,最好将节标题的背景设置为与表格视图或视图控制器的背景相匹配的纯色(或渐变)。

在这里,节标题具有完全不透明的渐变背景:

在此处输入图像描述

于 2018-02-06T18:55:08.383 回答
9

为了清晰的颜色,我使用

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

对我来说似乎很好。

于 2015-01-12T06:06:17.003 回答
8

在此处输入图像描述在界面生成器中,在顶部元素上拉起您的 .xib,在属性检查器中将背景颜色设置为默认值。然后转到 Content View 并在那里设置背景颜色(参考https://github.com/jiecao-fm/SwiftTheme/issues/24)。

于 2018-07-25T15:22:36.287 回答
4

iOS9 headerView.backgroundView.backgroundColor上为我工作:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

iOS8 上我使用headerView.contentView.backgroundColor没有问题,但现在在 iOS 9 上,我遇到了一个奇怪的问题,即背景颜色没有填满单元格的整个空间。所以我试过了headerView.backgroundColor,我从 OP 那里得到了同样的错误。

在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改用 contentView.backgroundColor。

所以现在一切都很好,没有警告使用headerView.backgroundView.backgroundColor

于 2015-08-06T16:41:20.120 回答
4

如果您使用 Storyboard/Nib 自定义节标题单元格,请确保背景颜色是“表节标题”视图的默认颜色。

如果您子类化UITableViewHeaderFooterView并使用 nib,那么您要做的就是IBOutlet为内容视图创建一个,并将其命名为例如。containerView. contentView这不要与作为此容器视图的父级的混淆。

使用该设置,您可以更改背景颜色containerView

于 2015-11-07T11:04:50.830 回答
4

如果您创建了UITableViewHeaderFooterViewwith xibfile 的自定义子类,那么您应该覆盖setBackgroundColor. 保持空白。

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

这将解决您的问题。

于 2015-12-27T18:00:28.777 回答
1

我尝试了外观当包含在链中,它对我有用。

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
于 2014-08-14T23:13:20.957 回答
1

将此代码放入UITableViewHeaderFooterView子类的初始化中:

let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
于 2020-03-25T06:06:54.093 回答
1

iOS 12,Swift 5。如果您愿意(或尝试!)使用外观代理,以下解决方案有效:

  1. 子类 UITableViewHeaderFooterView 并公开您自己的外观代理设置。
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. 以所需的粒度设置外观代理。
MySectionHeaderView.appearance().forceBackgroundColor = .red

或者

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red
于 2019-09-03T19:27:09.130 回答
1

忘记困难。

使用以下代码添加到您的项目UITableViewHeaderFooterView+BGUpdate.swift中:

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

用法很简单,正如您之前预期的那样:

headerView.backgroundColor = .red

用法示例

1)在代表的tableView:viewForHeaderInSection:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

或者

2)在您的自定义标题视图类中:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
于 2020-01-24T11:44:15.920 回答
1

可能是因为 backgroundView 不存在

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

那对我有用。

于 2017-12-17T09:25:25.577 回答
0

创建 UIView 并设置背景颜色,然后将其设置为 self.backgroundView。

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}
于 2016-06-07T10:11:31.450 回答
0

我觉得有必要分享我的经验。我的这段代码在 iOS 10 和 iOS 11 上运行良好headerView?.contentView.backgroundColor = .lightGray

然后我突然决定为 iOS 9 部署应用程序,因为有一些设备(iPad mini 一些老一代不会更新到任何超过 9 的操作系统) - 适用于所有 iOS 9、10 和 11 的唯一解决方案是为标题定义一个基本视图,然后包含所有其他标题子视图,从情节提要连接它并设置该backgroundColor基本视图。

在连接插座时要注意不要调用它:backgroundView因为在 some 中已经有一个具有该名称的属性superclass。我打电话给我的containingView

此外,在连接插座控件时,请单击视图Document Outline以确保它没有连接到file owner

于 2017-11-03T09:30:56.237 回答
0

用清晰的颜色设置 BackgroundView 对于可见的标题效果很好。如果滚动表格以在底部显示标题,则此解决方案将失败。

PSMy 表仅包含没有任何单元格的标题。

于 2015-09-22T06:41:59.960 回答
0

迅速:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}
于 2016-02-11T09:10:53.363 回答