UITableViewHeaderFooterView:无法更改背景颜色

时间:2013-03-24 22:37:58

标签: iphone ios xcode uitableview

我正在尝试更改UITableViewHeaderFooterView的背景颜色。虽然视图正在显示,但背景颜色仍然是默认颜色。我从xcode获取日志说:

  

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

但是,以下选项均无效:

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

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

有什么建议吗?感谢。

20 个答案:

答案 0 :(得分:171)

iOS 8,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];
    
  • 自动调整backgroundView的大小。 (无需添加约束)

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

  • 使用 XIB 时,请将根视图设为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
    }
    

Demo

↻ replay animation

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

答案 1 :(得分:75)

您应该使用myTableViewHeaderFooterView.tintColor,或者为myTableViewHeaderFooterView.backgroundView指定自定义背景视图。

答案 2 :(得分:17)

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

答案 3 :(得分:11)

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

self.contentView.backgroundColor = [UIColor whiteColor];

然后它会起作用。

答案 4 :(得分:9)

对我来说,我尝试了上述所有内容,但仍然收到警告 &#34;不推荐在UITableViewHeaderFooterView上设置背景颜色。请改用contentView.backgroundColor。&#34;然后我尝试了这个: 在xib文件中,标题视图的背景颜色被选中以清除颜色而不是默认颜色,一旦我将其更改为默认警告消失。 was this

Changed to this

答案 5 :(得分:5)

对于清晰的颜色,我使用

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

对我来说似乎很好。

答案 6 :(得分: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

的警告

答案 7 :(得分:4)

如果您是customising a section header cell with Storyboard/Nib,请确保&#34;表格标题标题&#34;的背景​​颜色为默认。图。

如果您继承UITableViewHeaderFooterView并使用nib,那么您需要做的是为内容视图创建IBOutlet,并将其命名为。 containerView。这不应与contentView混淆,后者是此容器视图的父级。

使用该设置,您可以改为containerView的背景颜色。

答案 8 :(得分:4)

如果您使用UITableViewHeaderFooterView文件创建了xib的自定义子类,则应覆盖setBackgroundColor。保持空虚。

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

}

这将解决您的问题。

答案 9 :(得分:4)

enter image description here在界面构建器中,将您的.xib向上拉到属性检查器顶部的元素中,将背景色设置为默认值。然后转到“内容视图”并在其中设置背景颜色(参考https://github.com/jiecao-fm/SwiftTheme/issues/24)。

答案 10 :(得分:3)

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

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

此处,节标题具有透明背景:

enter image description here

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

此处,节标题具有完全不透明的渐变背景:

enter image description here

答案 11 :(得分:1)

我尝试使用appearanceWhenContainedIn链,它对我有用。

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

答案 12 :(得分: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
    }
}

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

可能是因为backgroundView不存在

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

对我有用。

答案 16 :(得分: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

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

<强>夫特:

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

答案 19 :(得分:0)

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

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