UITableViewHeaderFooterView:无法更改背景颜色


124

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

不建议在UITableViewHeaderFooterView上设置背景色。请改用contentView.backgroundColor。

但是,以下选项均无效:

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

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

有什么建议?谢谢。


2
在iOS 13中,使用contentView.backgroundColor对我有用。我认为,苹果更新了这个
TA Truhoada

Answers:


94

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


2
myTableViewHeaderFooterView.tintColor可以完美运行。感谢你的回答!
2013年

15
不知道为什么,但是对我来说,tintColor不能在iOS7上工作。我只能通过分配自定义视图来更改颜色:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder 2014年

7
TintColor不是背景色!!
若奥·努涅斯

189

iOS 8、9、10、11 ...

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

迅速

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

对象

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时,将根视图设为 a UITableViewHeaderFooterView并以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找到其他详细信息。


5
contentView不存在,这就是为什么。tintcolor是为视图着色而不是背景。并且不建议使用backgroundcolor。因此,您的方式就是使其发挥作用的方式。顺便说一句漂亮的代码语法
若奥·努涅斯

@JoãoNunes,使用C#/ Xamarin时,语法更加整洁:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj 2014年

在Xcode 6.1.1中,您会收到运行时控制台警告:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori 2014年

使用Xcode6.2 beta5,我仍然收到同样的警告。我的UITableViewHeaderFooterView的创建方法是基于加载xib的,它类似于Apple示例代码TVAnimationsGestures。但是,带有Xcode6.2b5的TVAnimationGestures不会生成任何警告消息。苹果代码根本没有“背景”字符串。当然,在TVAnimationsGestures中,uitableVuewHeaderFooterview.contentView为零。我不明白为什么会这样。
kmugitani 2015年

7
对于仍然收到警告的人:确保UITableViewHeaderFooterView在IB中未设置backgroundColor。
Tuslareb '16

24

在iOS 7中contentView.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];

我认为这是一种比@SwiftArchitect的答案更好的方法(尽管它有效)。您不必添加新的UIView的事实使它变得更好。为我完美地工作。
埃里克·蒙塔涅斯

14

请确保您设置的的的backgroundColor contentViewUITableViewHeaderFooterView

self.contentView.backgroundColor = [UIColor whiteColor];

然后它将起作用。


仅iOS> = 10!对于iOS <10,使用:backgroundView?.backgroundColor = UIColor.white
Peter Kreinz

12

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

改成这个


7

为了获得清晰的色彩,我使用

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

对我来说似乎很好。


1
设置backgroundView = UIView()然后backgroundColor = .clear是唯一可行的解​​决方案。谢谢。
Vive

7

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

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

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

在此处输入图片说明

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

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

在此处输入图片说明


天才!为backgroundView定义一个空的UIView完全可以解决我的问题!谢谢!
Luiz Dias


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


4

如果您创建了UITableViewHeaderFooterViewwith xib文件的自定义子类,则应重写setBackgroundColor。保持空着。

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

}

这将解决您的问题。


这对我来说是正确的答案。虽然我没有在HeaderFooterView中设置任何背景颜色,但是警告消息始终出现在控制台日志中。很烦人!
stan liu

4

如果要使用Storyboard / Nib定制节标题单元格,请确保背景颜色为默认颜色 “表节标题”视图。

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

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


1

我试过了外观WhenContainedIn链,它对我有用。

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

1

也许是因为backgroundView不存在

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

对我有用。


1

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

  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

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
    }
}

好吧...你的方法更好。:)谢谢
Eli Burke

1
此解决方案导致iOS 12上的递归循环
。– Koppacetic

0

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

PSMy表仅由标头组成,没有任何单元格。


0

迅速:

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

0

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

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

0

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

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

在连接插座时,您要谨记不要叫它:backgroundView因为在某些地方已经有一个带有该名称的属性superclass。我打电话给我containingView

另外,在为插座控制装置接线时,请在视图中单击Document Outline以确保未将其接线至file owner


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

尽管这可以回答问题,但已将其标记为进行审查。没有解释的答案通常被认为是低质量的。请在答案中提供一些评论,说明这是正确答案的原因。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.