96

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

Community
  • 1
  • 1
Joel
  • 1,255
  • 1
  • 8
  • 19

17 Answers17

155

On iOS 15 you may want to reduce the sectionHeaderTopPadding

if #available(iOS 15.0, *) {
    tableView.sectionHeaderTopPadding = 0
}
rockdaswift
  • 8,673
  • 5
  • 39
  • 44
154

Did you try override this function:

override func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Kqtr
  • 5,645
  • 3
  • 21
  • 30
Icaro
  • 13,828
  • 5
  • 54
  • 72
43

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

Community
  • 1
  • 1
Sudhin Davis
  • 1,962
  • 12
  • 17
  • When I try that the minimum footer size is 1 which still leaves a 1point gap – Joel May 23 '15 at 16:36
  • Either you can change the color of that footer to the header section color.. So that the 1px black color can be ignored. – Sudhin Davis May 25 '15 at 03:39
  • @SudhinDavis you are right that there is footer height in xib but if we want no footer then Icaro's answer http://stackoverflow.com/a/30386480/2849443 is correct – Pooja Shah Nov 09 '15 at 06:08
  • That answer is far better than mine. Since that will also remove the extra lines from empty cells. Thanks. – Sudhin Davis Nov 09 '15 at 07:09
  • I liked possible solutions given in http://stackoverflow.com/questions/11445301/hide-footerview-in-iphone-tableview – Alphonse R. Dsouza Nov 11 '15 at 09:53
  • If a height of 1 for the footer is still too large you can return 0.01 in `heightForFooterInSection` in code. – Gordonium Mar 17 '16 at 13:48
18

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

}
Ladd.c
  • 843
  • 10
  • 11
  • Those are UITableViewDelegate methods. You do not override them. – Drew C Dec 03 '19 at 18:29
  • Ok I edited it my answer to a better and general implementation. Cheers. – Ladd.c Dec 12 '19 at 22:31
  • 1
    Nice! Not sure why this has not more upvotes. It's important to return a `UIView` or `nil` in `viewForFooterInSection`. Just using `heightForFooterInSection` (like mentioned in other answers does not work) – laka Feb 18 '22 at 23:20
12

For Swift 3

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
haris
  • 3,455
  • 1
  • 24
  • 26
7

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 having 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
    } else {
        return 40
    }
}
    
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.

b m gevariya
  • 198
  • 1
  • 3
  • 11
Fernando Cardenas
  • 1,145
  • 14
  • 17
6

You need to use the method heightForHeaderInSection for defining the 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;
    }
}
Tomerikoo
  • 15,737
  • 15
  • 35
  • 52
Ash
  • 5,035
  • 1
  • 38
  • 33
  • 1
    This is wrong. heightForHeaderInSection defines the height of the headerView for the section, not the space between them, which is what the OP was asking about. https://developer.apple.com/reference/uikit/uitableviewdelegate/1614855-tableview?language=objc – davidrynn Mar 09 '17 at 19:23
6

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;
}
Nicholas Allio
  • 616
  • 2
  • 9
  • 25
2

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];
}
Mithra Singam
  • 1,457
  • 19
  • 24
2

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
    }()
Nah
  • 1,721
  • 2
  • 24
  • 42
gsk_fs
  • 51
  • 8
  • please chek and verify in your code that **Style is set to plain** if story board you can find this word in tableView (Attribute inspector) – gsk_fs Dec 01 '20 at 09:33
1

This also may help :

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.sectionHeaderHeight = UITableViewAutomaticDimension
}
polarware
  • 2,459
  • 1
  • 23
  • 18
1

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.

Isaaс Weisberg
  • 641
  • 7
  • 23
1

In Xcode 13.2, you can adjust the height of the header and footer of sections in the storyboard - see screenshot below:

Height of Header and Footer of Sections in Xcode 13.2

rodorgas
  • 850
  • 2
  • 11
  • 28
maxMas
  • 19
  • 3
0

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;
} 
MichaelMao
  • 498
  • 6
  • 15
0

Work for me

tableView.sectionFooterHeight = 10
// ...

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

Pylyp Dukhov
  • 38,521
  • 10
  • 57
  • 92
Mirek
  • 1
  • 1
0

I just simply had to reduce the top padding for the tableview section header:

tableView.sectionHeaderTopPadding = 0
Euan Traynor
  • 154
  • 7
0

swift 5 iOS 15

self.tableView.estimatedSectionFooterHeight = 16.0 // spacing between Sections