72
votes

I need to reduce the space between two sections ofUITableView. I looked at this question but the solution doesn't allow for my custom header view because it combines the space of the footer and header.

Here is a picture of the UITableView. The black color is the UITableView background color.

tableview screenshot

13
I'm confuse about what you are trying to do. Do you want to remove the black space between the end of one section and the header of the next section? - Icaro
Yes I want to remove the black space - Joel
Xcode 6.0 and higher needs only self.tableV.sectionHeaderHeight = 0.0; self.tableV.sectionFooterHeight = 0.0; - Nik Kov
have you got what you wanted? Bcz I am not having any success - A.s.ALI
Had a similar issue today and this saved my life > stackoverflow.com/a/19296414/992461 - gabuchan

13 Answers

146
votes

Did you try override this function:

override func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
43
votes

I think you can solve this by adjusting the footer view height to its min: in Storyboard or XIB.enter image description here

I don't know what you have written in your code for footer height. Sorry if I am wrong.

Possible duplicate of Hide footer view in UITableView

13
votes

For Swift 4+ you need to implement these two methods

extension MyViewController : UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return UIView()
    }

}
12
votes

For Swift 3

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
9
votes

On iOS 15 you may want to reduce the sectionHeaderTopPadding

if #available(iOS 15.0, *) {
    tableView.sectionHeaderTopPadding = 0
}
6
votes

You need to use method heightForHeaderInSection for defining space between header & cell text. You can also change it depending on different sections for eg. at some sections you may need to show more distance & under some, you don't want to show gap. For such case you can use CGFLOAT_MIN which is 0.000001f. Giving you an example, how you can use different section with different header heights

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0 || section == 2)
    {
        return 55.0;
    }
    else
    {
        return CGFLOAT_MIN;
    }
}

Hope it will help you.

5
votes

Along with the answer posted by Icaro I would like to add that you also need to implement the tableView:viewForFooterInSection: method returning nil for the section you want to remove the empty space below It will then become:

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.001f;
}

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
}
3
votes

For Swift 5+:

There is some space for the headers and footers by default. That's why I was having the problem of setting an exact separation for the sections.

My solution to have a separation between 2 sections is the following:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

        if section == 0 {
             return 24
        } else if section == 1 {
             return 32
        }
    }

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        nil
    }

    override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        nil
    }

    override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        CGFloat.leastNormalMagnitude
    }

As you see for viewForFooterInSection and viewForHeaderInSection I needed to return nil.

In case you only want to change the footerHeight, just return CGFloat.leastNormalMagnitude for heightForHeaderInSection, and return the heights for each section in heightForFooterInSection.

1
votes

This also may help :

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.sectionHeaderHeight = UITableViewAutomaticDimension
}
1
votes

TableView Delegate methods doesn't effect with float value is 0.0f. Try giving a value greater than that.

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.00001f;
}

- (UIView*)tableView:(UITableView*)tableView
viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}
1
votes

Select the tableView in your storyboard/objectCode and ensure that the style is set to Plain, instead of Grouped. You can find this setting in the attributes "Inspector" tab.

let myTableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.register(TableCellClass.self, forCellReuseIdentifier: "cellId")
        tableView.backgroundColor = UIColor(red: 123/255, green: 190/255, blue: 120/255, alpha: 1)
        tableView.separatorStyle = .none
        tableView.translatesAutoresizingMaskIntoConstraints = false
        return tableView
    }()
0
votes

You can do it by implement the delegate heightForHeaderInSection & heightForFooterInSection.

The return vaule should not be 0, even if the SectionHeader or the height of SectionFooter is 0, it need a very small value, try CGFLOAT_MIN.

for my example:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if (section == [self.dataArray indexOfObject:self.bannerList]) {
    return 46;
}
return CGFLOAT_MIN;

}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
} 
0
votes

Rather than implementing the UITableViewDelegate methods and defining the sectionFooterHeight via CGFloat.leastNormalMagnitude, one can alternatively just

tableView.sectionFooterHeight = 0

and the spacing between sections while no footer is present will go away.

The mechanism is that by default this value is set to UITableView.automaticDimension.

As long as

  • it stays UITableView.automaticDimension
  • there are no delegate/dataSource methods that implement the configuration of footer i.e. titleForFooterInSection/viewForFooterInSection
  • table view's style is set to .grouped

then UITableView will deliberately insert a spacing between sections with no view.

You change sectionFooterHeight to 0, the magic goes away.