Change the sections header background color in UITableView using an array of headers

IosUitableviewSwiftIos8

Ios Problem Overview


I have a array of headers that I use

let sectionHeaderTitleArray = ["test1","test2","test3]

and they are showed using

func tableView[tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return self.sectionHeaderTitleArray[section] as String
} 

Now all of this works fine but I would like to modify the background color of the headers so that they are more visible (Darker Color)

any idea if I can do this in a simple line or do I need to use a custom cell to create this

thanks

update

  //number of sections and names for the table
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return self.sectionHeaderTitleArray.count
    }
    
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return self.sectionHeaderTitleArray[section] as String
    }
    func tableView(tableView: UITableView, ViewForHeaderInSection section: Int) -> UIView? {
        return self.tableView.backgroundColor = UIColor.lightGrayColor()
    }

Ios Solutions


Solution 1 - Ios

If you're using only titleForHeaderInSection :

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    (view as! UITableViewHeaderFooterView).contentView.backgroundColor = UIColor.black.withAlphaComponent(0.4)
    (view as! UITableViewHeaderFooterView).textLabel?.textColor = UIColor.white
}

Solution 2 - Ios

Instead of using the

func tableView(_ tableView: UITableView,titleForHeaderInSection section: Int) -> String?

data source method, you can use the

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

delegate method and simply customize the UIView returned as you wish.

For example set the text of the UILabel textLabel to your desired value and the backgroundColor to the desired UIColor.

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let returnedView = UIView(frame: CGRectMake(x, y, width, height)) //set these values as necessary
    returnedView.backgroundColor = UIColor.lightGrayColor()

    let label = UILabel(frame: CGRectMake(labelX, labelY, labelWidth, labelHeight))
    label.text = self.sectionHeaderTitleArray[section]
    returnedView.addSubview(label)

    return returnedView
}

SWIFT 5

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let returnedView = UIView(frame: CGRect(x: x, y: y, width: width, height: height)) //set these values as necessary
            returnedView.backgroundColor = .white
            
            let label = UILabel(frame: CGRect(x: x, y: y, width: width, height: height))
            
            label.text = self.sectionHeaderTitleArray[section]
            returnedView.addSubview(label)
            
            return returnedView
        }

Solution 3 - Ios

You have to keep both

> titleForHeaderInSection

AND

> viewForHeaderInSection

Here is some working code in Swift 3

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.sectionHeaderTitleArray[section]
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let returnedView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 25))
    returnedView.backgroundColor = .lightGray
    
    let label = UILabel(frame: CGRect(x: 10, y: 7, width: view.frame.size.width, height: 25))
    label.text = self.sectionHeaderTitleArray[section]
    label.textColor = .black
    returnedView.addSubview(label)
    
    return returnedView
}

Solution 4 - Ios

SWIFT 5

public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerId") as! CustomHeader
    let background = UIView(frame: view.bounds, background: .clear)
    header.backgroundView = background
    return header
}

SWIFT 4

Super easy, by setting header's view, contentView background color..

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerId") as! CustomHeader
   header.contentView.backgroundColor = AnyColor
   return header
}

Solution 5 - Ios

Swift 5 iOS 13:

//Remove 'override' if you don't override from UITableviewController
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let headerView = view as? UITableViewHeaderFooterView else { return }
    headerView.tintColor = .clear //use any color you want here .red, .black etc
}

Solution 6 - Ios

Swift 4.X

This is tested and working code.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "Total Count (41)"
}

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    view.tintColor = UIColor.lightGray
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.darkGray
    header.textLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium)
}

Solution 7 - Ios

Swift 3+

I used this:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 20))
    headerView.backgroundColor = .lightGray
    
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = stringValues[section]
    headerView.addSubview(label)
    label.leftAnchor.constraint(equalTo: headerView.leftAnchor).isActive = true
    label.rightAnchor.constraint(equalTo: headerView.rightAnchor).isActive = true
    label.centerYAnchor.constraint(equalTo: headerView.centerYAnchor).isActive = true
    label.heightAnchor.constraint(equalToConstant: 25).isActive = true
    
    return headerView
    
}

Solution 8 - Ios

Swift 5

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    
    guard let headerView = view as? UITableViewHeaderFooterView else { return }
    
    headerView.backgroundView?.backgroundColor = .red
}

And, if you want different header background (and/or text) colors for each section:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    
    guard let headerView = view as? UITableViewHeaderFooterView else { return }
    
    switch section {

    case 0:
        headerView.backgroundView?.backgroundColor = .red
        headerView.textLabel?.textColor = .white
    case 1:
        headerView.backgroundView?.backgroundColor = .green
        headerView.textLabel?.textColor = .white
    case 2:
        headerView.backgroundView?.backgroundColor = .yellow
        headerView.textLabel?.textColor = .black
        
        // etc
        
    default:
        return
    }

Solution 9 - Ios

Swift5

Versión updated to iOS 11,12,13,14 with example

change background color and text color:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let tableView = view as? UITableViewHeaderFooterView else { return }
    tableView.textLabel?.textColor = UIColor.white
    tableView.contentView.backgroundColor = UIColor.black
}

Full example of viewcontroller:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    private let array: [String] = ["ab","bc","cd","de","ef","fg","gh","hi","ij","jk"]
    let sectionHeaderTitleArray = ["test1","test2", "test3"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if #available(iOS 11, *) {}
        else {
            self.edgesForExtendedLayout = []
        }
        configTableview()
    }
    
    private func configTableview() {
        tableView.registerCell(type: SyncCell.self)
        tableView.separatorColor = #colorLiteral(red: 0, green: 0.3066673801, blue: 1, alpha: 0.19)
        tableView.delegate = self
        tableView.dataSource = self
    }
}


extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        guard let tableView = view as? UITableViewHeaderFooterView else { return }
        tableView.textLabel?.textColor = UIColor.white
        tableView.contentView.backgroundColor = UIColor.black
    }
    
    func tableView(_ tableView: UITableView,titleForHeaderInSection section: Int) -> String? {
        return sectionHeaderTitleArray[section]
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 130
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected cell: \(indexPath)")
    }
}

extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let item = array[indexPath.row]
        let cell = tableView.dequeueReusableCell(type: SyncCell.self, forIndexPath: indexPath)
        cell.configCell(text: item)
        cell.selectionStyle = .none
        return cell
    }
    
}

Solution 10 - Ios

If you are using titleForHeaderInSection, then the easiest way is to add in viewDidLoad():

self.tableView.backgroundColor = UIColor.clear

For some reason, setting ClearColor for Background in the View section for the TableView in the Interface Builder doesnt always set it to transparent. But adding this one line in the code (for me at least) does.

Solution 11 - Ios

override viewForHeaderInSection and create UITableViewHeaderFooterView

 override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    var headrview = tableView.dequeueReusableHeaderFooterView(withIdentifier: "aaa")
    if headrview == nil {
        headrview = UITableViewHeaderFooterView(reuseIdentifier: "aaa")
    }
    let bview = UIView()
    bview.backgroundColor = Theme.current.navigationColor
    headrview?.backgroundView = bview
    headrview?.textLabel?.textColor = Theme.current.primaryTextColor
    return headrview
}

Solution 12 - Ios

Swift 4 solution.

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView:UIView = UIView()
        headerView.backgroundColor = UIColor.lightGray
   return headerView
}

Solution 13 - Ios

If you have a custom header view, you can do it with contentView.backgroundColor.

Solution 14 - Ios

There is no need to use hacks such as willDisplayHeaderView method or others. Simply create your own class of UITableViewHeaderFooterView. Then in func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? return your created custom header view. You should change background color not directly for your header view but for contentView of your header view 

let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: NotificationSettingsHeaderView.reuseIdentifier) as! NotificationSettingsHeaderView
headerView.label.text = dataSource.snapshot().sectionIdentifiers[section].title
headerView.contentView.backgroundColor = .red
return headerView

What's even better is to setup background color in init of your header view subclass

Solution 15 - Ios

This will change it for all the headers in your application :

UITableViewHeaderFooterView.appearance().backgroundColor = theme.subViewBackgroundColor

Solution 16 - Ios

override or implement the function tableview will display

public func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        let headerView = (view as? UITableViewHeaderFooterView)
        headerView?.tintColor = .clear
    }

Solution 17 - Ios

We can change the footer color in a section of tableView using the below code snippet.

  1. call the Method heightForFooterInSection

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 5.0 }

  2. call the method viewForFooterInSection

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let viw = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 5)) viw.backgroundColor = .white return viw }

Hope this will help you. This is a tested Code.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJp4RealView Question on Stackoverflow
Solution 1 - IosJovan StankovicView Answer on Stackoverflow
Solution 2 - IosJack CView Answer on Stackoverflow
Solution 3 - IosAMAN77View Answer on Stackoverflow
Solution 4 - IosMAGiGOView Answer on Stackoverflow
Solution 5 - IosAdriatik GashiView Answer on Stackoverflow
Solution 6 - IosAshuView Answer on Stackoverflow
Solution 7 - IosDasogaView Answer on Stackoverflow
Solution 8 - IosrbaldwinView Answer on Stackoverflow
Solution 9 - IosblackerView Answer on Stackoverflow
Solution 10 - IosGefilte FishView Answer on Stackoverflow
Solution 11 - IosKMIView Answer on Stackoverflow
Solution 12 - IosdscrownView Answer on Stackoverflow
Solution 13 - IosGreatCornholioView Answer on Stackoverflow
Solution 14 - IosVitalik KizlovView Answer on Stackoverflow
Solution 15 - IosdevjmeView Answer on Stackoverflow
Solution 16 - IosMuhammadjonView Answer on Stackoverflow
Solution 17 - IosKhushtar parvezView Answer on Stackoverflow