UITableViewHeaderFooterView: 无法更改背景颜色

我试图更改 UITableViewHeaderFooterView 的背景颜色。虽然出现了视图,但背景颜色仍然是默认颜色。我收到 Xcode 的日志说:

在 UITableViewHeaderFooterView 上设置背景色 不推荐。请改为使用 contentView.background Color。

然而,以下选项都不起作用:

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

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

有什么建议吗? 谢谢。

65132 次浏览

您应该使用 myTableViewHeaderFooterView.tintColor,或者为 myTableViewHeaderFooterView.backgroundView分配一个自定义的背景视图。

在 iOS7contentView.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];

我尝试了外观时,包含在链,它为我工作。

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil]
setBackgroundColor: [UIColor.grayColor]];

IOS8,9,10,11...

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

斯威夫特

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

Obj-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];
    
  • the backgroundView is resized automatically. (No need to add constraints)

  • Control alpha with UIColor(white: 0.5, alpha: 0.5) or backgroundView.alpha = 0.5.
    (of course, any color will do)

  • When using XIB, make root view a UITableViewHeaderFooterView and associate the backgroundView programmatically:

    Register with:

    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
    }
    

Demo

↻ replay animation

► Find this solution on GitHub and additional details on Swift Recipes.

确保你为你的 UITableViewHeaderFooterView设置了 contentView的背景颜色:

self.contentView.backgroundColor = [UIColor whiteColor];

那就成功了。

为了清晰的颜色,我使用

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

我觉得挺好的。

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没有问题,但是现在在 iOS9上,我遇到了一个奇怪的问题,使得背景颜色不能填满整个单元格。所以我只尝试了 headerView.backgroundColor,我从 OP 得到了相同的错误。

在 UITableViewHeaderFooterView 上设置背景色 不推荐。请改为使用 contentView.background Color。

因此,现在一切都工作得很好,没有警告使用 headerView.backgroundView.backgroundColor

使用清晰的颜色设置 BackoundView 可以很好地处理可见标题。 如果滚动表以显示底部的标题,则此解决方案将失败。

P.S. 我的表只包含没有单元格的标题。

如果你是 用 Storyboard/Nib 自定义一个段标题单元格,那么确保背景颜色是 违约的“表节头”视图。

如果您继承了 UITableViewHeaderFooterView,并使用 nib,那么您需要做的就是为内容视图创建一个 IBOutlet,并将其命名为 eg. 。containerView.这不要与 contentView混淆,contentView是这个容器视图的父代。

通过这种设置,可以改变 containerView的背景颜色。

如果您使用 xib文件创建了 UITableViewHeaderFooterView的自定义子类,那么您应该覆盖 setBackgroundColor

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


}

这会解决你的问题。

斯威夫特:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
headerView.backgroundView.backgroundColor = UIColor.redColor()
}

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

- (void)setupBackgroundColor:(UIColor *) color {
UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
bgView.backgroundColor = color;
self.backgroundView = bgView;
}

对我来说,我尝试了以上所说的一切,但仍然得到了警告 “在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改为使用 contentView.backoundColor。”然后我尝试这样做: 在 xib 文件中,头部视图的背景颜色被选择为清除颜色,而不是默认颜色,一旦我更改为默认警告消失。 was this

Changed to this

我觉得有必要分享我的经历。 我有一段代码可以很好地与 iOS10和 iOS11headerView?.contentView.backgroundColor = .lightGray一起工作

然后我突然决定把这个应用部署到 iOS 9上,因为有一些设备(iPad mini 一些老一辈的设备不会更新到超过9的任何操作系统上)——对于所有的 iOS 9、10和11,唯一有效的解决方案是为头部定义一个基本视图,然后包含所有其他的头部子视图,将它从故事板连接起来,并设置基本视图的 backgroundColor

当连接插座时,不要调用: backgroundView,因为在某些 superclass中已经有一个名为 backgroundView的属性。我叫我的 containingView

此外,当布线出口控制点击在 Document Outline的视图,以确保它没有连接到 file owner

也许是因为背景视图不存在

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

对我有用。

对于纯背景色,设置 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!
}
}

然而,要小心可能的副作用。除非表格视图被设置为“分组”,否则当向下滚动时,部分标题将会在顶部弹出。如果节标题是透明的,单元格内容将被看穿,这可能看起来不太好。

在这里,部分标题有透明的背景:

enter image description here

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

在这里,部分标题有一个完全不透明的渐变背景:

enter image description here

enter image description here在 Interface Builder 里拉起你的。在顶部元素 xib 中,属性检查器将背景颜色设置为默认。然后转到内容视图并在那里设置背景颜色(参考 https://github.com/jiecao-fm/SwiftTheme/issues/24)。

IOS12,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

忘记困难。

用以下代码添加到项目 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
}
}

在初始化 视图子类时使用以下代码:

let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear

现在,自从 iOS14以来,我们已经为 UITableViewHeaderFooterView 配置了 UIBackground 配置。

要改变背景颜色,我正在做以下操作:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let headerView = view as? LeftMenuSectionHeader {
if var backgroundConfig = headerView.backgroundConfiguration {
backgroundConfig.backgroundColor = UIColor.clear
headerView.backgroundConfiguration = backgroundConfig
}
}
}