UITableview 中节之间的空间

我需要减少 UITableView的两个部分之间的空间。我看了这个 有个问题,但是解决方案不允许我的自定义页眉视图,因为它结合了页脚和页眉的空间。

这是一张 UITableView的图片。黑色是 UITableView的背景颜色。

tableview screenshot

101095 次浏览

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

Did you try override this function:

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

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

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

For Swift 3

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

This also may help :

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

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

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

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


}

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.

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

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.

On iOS 15 you may want to reduce the sectionHeaderTopPadding

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

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

Work for me

tableView.sectionFooterHeight = 10
// ...


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

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

tableView.sectionHeaderTopPadding = 0

swift 5 iOS 15

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