Starting in iOS7, there is additional space at the top of my UITableView
's which have a style UITableViewStyleGrouped
.
Here is an example:
The tableview starts at the first arrow, there are 35 pixels of unexplained padding, then the green header is a UIView
returned by viewForHeaderInSection
(where the section is 0).
Can anyone explain where this 35-pixel amount is coming from and how I can get rid of it without switching to UITableViewStylePlain
?
In iOS 11 and later:
tableView.contentInsetAdjustmentBehavior = .never
This question is related to
ios
uitableview
ios7
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
That's all folks!
just unchecking Adjust Scroll View Insets
didn't work for me.
Later, I tried to set tableview's header to nil, which fortunately worked.
self.tableView.tableHeaderView = nil
For me, I tried all the solutions but I was thinking to set height for UITableView section and it's working for me.(Using swift)
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.001
}
I noticed there are many answers to this question depending on what you're trying to do, so I'd share mine in case anyone is going for something the same effect:
In my view controller, I have a grouped UITableView
whose tableHeaderView
is composed of a 200-point tall UIScrollView
, and a single attributed UILabel
that contains an ad title, price, location, and time posted. Below it are the contents of the table view.
With the default dimensions of a grouped table view header, the "MORE INFO" header is too far below the "5 days ago" label. I fixed it (already the above image) by overriding the heights for the header and footer of each section.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return UITableViewAutomaticDimension;
}
I learned about overriding the heights from @erurainon's comment in the accepted answer, and UITableViewAutomaticDimension
from https://stackoverflow.com/a/14404104/855680. I didn't have to set self.automaticallyAdjustsScrollViewInsets
to NO
in my view controller unlike what the accepted answer suggests.
I also already tried setting the UIEdgeInsets
and giving the table view a negative value for the top, but it didn't work--the entire table view moves up, including the tableHeaderView
.
Storyboard:
Just uncheck: Adjust Scroll View Insets
in View Controller's options
Code:
self.automaticallyAdjustsScrollViewInsets = false
override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None
// OR
self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
//OR
self.automaticallyAdjustsScrollViewInsets = false
}
Swift: iOS I had tableview on scroll view .. when I was click "Back" on the same screen. Scroll view take more space on top.. to solve this I have used :
self.automaticallyAdjustsScrollViewInsets = false
A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets. Default value is true, which allows the view controller to adjust its scroll view insets in response to the screen areas consumed by the status bar, navigation bar, and toolbar or tab bar. Set to false if you want to manage scroll view inset adjustments yourself, such as when there is more than one scroll view in the view hierarchy.
In my case this was what helped me. I'm supporting ios6 also.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
if I add a tableHeaderView with a really small height, it fixes the problem
let v = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.000000001))
tableViewDocuments.tableHeaderView = v
Throwing my ten cents in - I had the same problem after I removed a header cell from a tableview. To resolve I changed the TableView Style in the Attributes Inspector from "Grouped" to "Plain" and the extra space was removed.
Using swift 4.1. Try this:
func tableView(_ tableView: UITableView, viewForHeaderInSection
section: Int) -> UIView? {
return nil
}
I have a VC with a Container in it (which btw is part of a Nav controller), and embedded in that is a TableVC.
Selecting my TableVC, looking at the attributes panel:
Then I set the autoconstraint for the Container relative to the parent view as:
Container View.top = ParentView.Top Margin
This accomplishes the following for me:
Lots of trial and error for me with this setup, but I eventually found these little details posted by lekksi @ Remove empty space before cells in UITableView
None of the previous answers worked for me. What did end up working for my situation (which was seeing that padding after dynamically adding a header to my Table View
) was selecting the Navigation Bar
from the Document Outline
and rechecking the Translucent
box (contrary to some answers that were saying to force it to be translucent). I had previously unchecked it because it had made my red look a little orange, but I could not try the solution of reordering the elements in the scene since the Table View
was the only element in this scene. This solution works as long as you are okay with the Navigation Bar
's color having a translucent layer over it. Hope this helps :)
Make sure that you have given constraints to the table. I hadn't and faced the similar issue of having an unexplained padding at the bottom of table.
None of the answers or work-arounds helped me. Most were dealing with the tableView itself. What was causing the issue for me was the view I was adding the tableView or collectionView onto. This is what fixed it for me:
SWIFT 5
edgesForExtendedLayout = []
I put that in my viewDidLoad and the annoying gap went away. Hope this helps.
self.automaticallyAdjustsScrollViewInsets = NO;
try, you can deal with it!
To solve this problem one would need to disable the standard section footer. The following snippet does the job:
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return nil
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0
}
Usage of
tableView.contentInsetAdjustmentBehavior = .never
is completely unrelated here
in iOS 7 you view starts a the of the screen instead of beneath the navBar. its vry simple to set that to the bottom of ur navbar. Check THIS answer for the solution, its not the same question but very related to yours.
My answer is going to be more general answer, but can be applied on this as well.
If the root view (of the ViewController) or the first child (subview) of the root view is subclass of the UIScrollView (or UIScrollView itself), and if
self.navigationController.navigationBar.translucent = YES;
framework will automatically set pre-calculated contentInset.
To avoid this you can do
self.automaticallyAdjustsScrollViewInsets = NO;
but in my case I wasn't able to do this, because I was implementing SDK which has UIView component which can be used by other developers. That UIView component contains UIWebView (which has UIScrollView as the first subview). If that component is added as the first child in the UIViewController's view hierarchy, automatic insets will be applied by system.
I've fixed this by adding dummy view with frame (0,0,0,0) before adding UIWebView.
In this case system didn't find subclass of the UIScrollView as the first subview and didn't apply insets
if self.automaticallyAdjustsScrollViewInsets = NO;
doesn't work for you, make sure the height of either tableview header or section header is CGFLOAT_MIN
not 0
.
For example if you want to make tableview header 0 high, you can do:
CGRect frame = self.tableViewHeader.frame;
frame.size.height = CGFLOAT_MIN; //not 0
self.tableView.tableHeaderView.frame = frame;
self.tableView.tableHeaderView = self.tableViewHeader;
Hope it helps.
According to this transition guide for iOS7 by Apple, the scroll view’s content insets is automatically adjusted. The default value of automaticallyAdjustsScrollViewInsets is set to YES.
The UIViewController which has the UITableView should set this property to NO.
self.automaticallyAdjustsScrollViewInsets = NO;
This will do the trick.
EDIT 1:
Also, one could try -
self.navigationController.navigationBar.translucent = YES;
This also removes the extra padding on the top.
You just do this
tableView.contentInsetAdjustmentBehavior = .never
Tableviews have a very strange behavior these days:
On devices with a notch (XR, etc) it will without telling you add more inset BUT ONLY IF the table starts at the physical top of the screen.
If you start NOT at the top of the screen, it won't do that, but
Both of those cases are >> unrelated << to safeAreaInsets
....... which is very confusing
All of that is totally undocumented ... you can waste hours figuring this out.
If you do need your measurements to start actually from the top of the screen/table,
in fact simply go:
tableView.contentInsetAdjustmentBehavior = .never
A good example is obviously when you add some sort of banner or similar thing over the top of a table, which is common these days, and you just set the top inset of the table to whatever height your banner/etc becomes when it's running.
To do that, you must use the
tableView.contentInsetAdjustmentBehavior = .never
call :/
Don't forget that almost always these days, you're loading some information (user pictures, description, whatever) dynamically, so you can't set such values to the final needed value until the info arrives. Another gotchya. :/
So you'd have code like:
func setTableOffsetOnceFlagAreaSizeIsKnown() {
tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setTableOffsetOnceFlagAreaSizeIsKnown()
}
I'm assuming that is just part of the new UITableViewStyleGrouped
styling. It is in all grouped table views and there doesn't seem to be any direct way to control that space.
If that space is being represented by a UIView
, it would be possible to search through all the subviews
of the UITableView
to find that specific view and edit it directly. However, there is also the possibility that that space is just a hardcoded offset before headers and cells start and there won't be any way to edit it.
To search through all subviews (I would run this code when the table has no cells, to make it a little easier to read the output):
- (void)listSubviewsOfView:(UIView *)view {
// Get the subviews of the view
NSArray *subviews = [view subviews];
// Return if there are no subviews
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSLog(@"%@", subview);
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}
This is how it can be fixed easily in iOS 11 and Xcode 9.1 through Storyboard:
Select Table View > Size Inspector > Content Insets: Never
You could detect if your app is running iOS7 or greater and add this two methods in your table view delegate (usually in your UIViewController code)
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
This maybe is not an elegant solution but works for me
Swift version:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
Simply add the following to your viewDidLoad in your VC:
self.automaticallyAdjustsScrollViewInsets = NO;
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.0
}
This worked for me. Also one can give height for header based on the section.
In my case there was unwanted cell called "HeaderView" on prototype visualization in Storyboard, when I deleted it everything was good.
for the first section, we need to set tableHeaderView
like this:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
and also for the other sections, we should set heightForFooterInSection
like this:
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0.01
}
Swift 4 answer...
If the table view is selected in interface builder and in the attributes inspector the style "Grouped" is selected, enter the following code in your view controller to fix the extra header space issue.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
set
override func viewDidLoad() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
Try changing the contentInset
property that UITableView
inherits from UIScrollView
.
self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
It's a workaround, but it works
A lot of the previous answers above are too hacky. They would break at anytime in the future if Apple decides to fix this unexpected behavior.
Root of the issue:
a UITableView
doesn't like to have a header with a height of 0.0. If what's you're trying to do is to have a header with a height of 0, you can jump to the solution.
even if later you assign a non 0.0 height to your header, a UITableView
doesn't like to be assigned a header with a height of 0.0 at first.
Solution:
Then, the most simple and reliable fix is to ensure that your header height is not 0 when you assign it to your table view.
Something like this would work:
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;
Something like this would lead to the issue at some point (typically, after a scroll):
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Thanks to the answer by @Aurelien Porte. Here is my solution
Cause of this issue:-
In ViewDidLoad:-
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
No Need For Something Like This :-
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
In heightForHeaderInSection
delegate:-
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
In viewForHeaderInSection
delegate :-
if section == 0
{
// Note CGFloat.min for swift
// For Objective-c CGFLOAT_MIN
let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min))
return headerView
}
else
{
// Construct your other headers here
}
tableView.contentInsetAdjustmentBehavior = .never
was the solution for me (iOS12 / xcode 10) on a plain tableview with headers
use this one i think this help...
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
Finally figured how to fix this after trying everything!
I noticed that for some reason the contentOffset of my tableview had a 'y' of -20 so when configuring my tableview: swift 3/4
tableView.contentOffset = .zero
Objective-C
self.tableView.contentOffset = CGPointMake(0, 44);
Another quick comment... even in XCode 6.1, there is a bug with vertical spaces appearing at the top of UIScrollViews
, UITextViews
and UITableViews
.
Sometimes, the only way to fix this issue is to go into the Storyboard and drag the problem control so it's no longer the first subview on the page.
(My thanks to Oded for pointing me in this direction... I'm posting this comment, just to add a few screenshots, to demonstrate the symptoms and fix.)
The only thing that worked for me was:
Swift:
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
Objective-C:
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
Also, I still had an extra space for the first section. That was because I was using the tableHeaderView
property incorrectly. Fixed that as well by adding:
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Just pin your tableview (or make it begin) at the absolute top of the view. The additional unwanted space is exactly the height of a navigation bar.
Please check if the tableview is grouped/plain. In my case I have changed the style to plain and it worked. Now the extra spacing above the header has disappeared.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
Yet another way of doing it... but I like it because it avoids hardcoding any height value.
In a UITableViewStyleGrouped
table (static or dynamic), just assign the desired height in tableView(_:heightForHeaderInSection)
. I'm calculating the new height based on the bottom padding for the section header label.
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
var height = UITableViewAutomaticDimension
if section == 0, let header = tableView.headerViewForSection(section) {
if let label = header.textLabel {
// get padding below label
let bottomPadding = header.frame.height - label.frame.origin.y - label.frame.height
// use it as top padding
height = label.frame.height + (2 * bottomPadding)
}
}
return height
}
Tested on iOS 9, Xcode 7.3.
Hope it helps.
I think making UIEdgeInsets -35 0 0 0 is tedious. In my case, I implemented tableView: heightForHeaderInSection: method and it has a potential to return 0.
When I changed 0 to 0.1f, the problem just went away.
While using grouped TableView use this to avoid border cutting in viewWillAppear
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
For IOS 7 if you are allocing a tableview in a view controller you may look into
self.edgesForExtendedLayout = UIRectEdgeNone;
your problem seemed similar to mine
Update:
Swift in iOS 9.x:
self.edgesForExtendedLayout = UIRectEdge.None
Swift 3 :
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
Swift 4 code: For tableview with no section headers you can add this code:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
and you will get the header spacing to 0.
If you want a header of your specific height pass that value:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
and the view from viewForHeaderinSection delegate.
I went through all answers. None worked for me. All I had to do was:
self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0
Additionally the issue wasn't happening at the top of tableView. It was happening at the top of each section of the tableView.
FWIW this issue was only happening for iOS9. Our app worked fine for iOS10 and iOS 11.
I highly recommend you to see this awesome question and its top answers:
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
This code worked for me, The best answer for me that was written in objective-C
at up-side so I converted it into Swift.
For Swift 4.0+
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))
Just write this into viewDidLoad()
and it will work like a charm.
According to the Apple documentation:
When assigning a view to this property, set the height of that view to a nonzero value. The table view respects only the height of your view's frame rectangle; it adjusts the width of your header view automatically to match the table view's width.
Swift 5
If you have a grouped UITableView
where you want a tableHeaderView
:
Before assigning a view to tableView.tableHeaderView
, set the height of that view to a nonzero value, e.g:
// Set the initial height of your custom view to the smallest value
myTableHeaderView.frame.size.height = .leastNonzeroMagnitude
// Assign your custom view to the header view
tableView.tableHeaderView = myTableHeaderView
// Set width constraint, height should grow based on your view.
tableView.tableHeaderView!.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true
No need for magic with contentInsets
or handling delegate methods.
When you use UITableView.Style.grouped or UITableView.Style.InsetGrouped the tableview will automatically add a top inset padding to the "section header" if no "tableview header" is present, the fix is simple:
self.tableview.tableFooterView = UIView(frame: CGRect.init(origin: .zero, size: CGSize.init(width: tableview.frame.size.width, height: 1)))
self.tableview.tableHeaderView = UIView(frame: CGRect.init(origin: .zero, size: CGSize.init(width: tableview.frame.size.width, height: 1)))
If you are using UITableView.Style.Plain
self.tableview.contentInsetAdjustmentBehavior = .never
Will generally be sufficient
When you need to hide your tableHeaderView, you should use this Swift 3 code:
tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))
Swift3
If you are using grouped table then do following things . This will remove top space.
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
self.tableView.tableHeaderView = UIView(frame: frame)
self.tableView.tableFooterView = UIView(frame: frame)
If you Still getting this issue then it will remove by default content offset from top.
[Set content insets never]
https://i.stack.imgur.com/fjxOV.png
I had this exact problem, but with a tableView inside a tableView cell. Nothing worked from the numerous answers from above. A very odd and simple thing worked:
- Put the estimated heights before assigning the delegate for the tableView!!
override func awakeFromNib() {
super.awakeFromNib()
tableView.estimatedRowHeight = 58
tableView.estimatedSectionHeaderHeight = 45
tableView.estimatedSectionFooterHeight = 10
tableView.dataSource = self
tableView.delegate = self
}
Putting the estimates after the delegate assignment, caused my inner tableView to have an odd white space above the header. I hope it helps someone here.
I had faced the extra top space issue, I had to club a bunch of answers to reach the solution. (5 hours of checking all answers given)
first if your concerned
Table view - mode is "Group" please change it to "Plain"
no need to do any changes to header or footer section, or add additional delegate methods related to them
Then in the ViewController that has your TableView in InterfaceBuilder - Uncheck Adjust Scroll View Insets - Uncheck Extend edges: Under Top Bars
*Also, make sure you are deleting derived data and re-installing your app in simulator or phone to reflect the changes done effectively.
I had the same fix as arielyz. Once I moved the UITableView to be not the first subview of the parent view, it went away. My space was 20 px, not 35.
I wasn't able to recreate it in a portrait xib, only a landscape xib. I'll file a radar bug later if I can reproduce it in a simple demo app.
I've been banging my head against this one as well. Pretty sure this is an iOS7 bug. What helped me eventually, is the order of views in the xib. I had one view in which table view was displayed correctly, and another in which the table view had that extra 35px space. The only difference between then (UITableView wise), is that in the bad-displaying view UITableView was the first child, whereas in the view which was displaying correctly, it was the second.
That did the trick for me, just changing the order of views. I really prefer not to add extra lines of code for a workaround...
I played around with it a bit more and it seems like this is a side-effect of setting the tableView's tableHeaderView = nil
.
Because my tableView has a dynamically appearing tableHeaderView
, when I need to hide the tableHeaderView
, instead of doing self.tableView.tableHeaderView = nil;
, I do:
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
I like this solution better than setting a somewhat arbitrary contentInset.top
because I use the contentInset.top
dynamically as well. Having to remember to remove an extra 35px whenever I recalculate contentInset.top
is tedious.
We have multiple answers for this.
1) You can add UIImageview at view didload
UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];
2) You can set header and footer height 0.1
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
3) You can add header and footer view with height 0.1
tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
Doing below (Swift) solves the problem, but this works when you don't need a header.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.min
}
If you do, you'll have to abandon the very first section and use other for content.
UITableViewDataSource
implementation:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return <number_of_data_sections>+1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// the first section we don't use for data
if section == 0 {
return 0
}
// starting from 1, there are sections we use
if section == 1 {
let dataSection = section - 1
// use dataSection for your content (useful, when data provided by fetched result controller). For example:
if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
return sectionInfo.numberOfObjects
}
}
return 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
// return cell using transformed dataIndexPath
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 1 {
// return your header height
}
return CGFloat.min
}
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 1 {
// return your header view
}
return nil
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
// in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
return CGFloat.min
}
And that's it. Model does not know anything about the change, because we transforms the section number upon accessing the data.
self.automaticallyAdjustsScrollViewInsets = NO;
This was deprecated in iOS 11, so you should use new property
contentInsetAdjustmentBehavior
in your code, it should fix the problem.
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
}
There is a new property on UIScrollView called contentInsetAdjustmentBehavior added in iOS 11 to determine adjust content offset
So I was trying every method here, and this time none of them helped. My case was a grouped table view on iOS 9. I don't really know why and how I found out this one, but for me, setting the tableViewHeader
with a UIView
with at least 0.01
height worked out. CGRectZero
didn't help, nothing really helped:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
With storyboard:
Make sure that your UITableView top constraint doesn't say "Under top layout guide". Instead it should say "Top space to: Superview" (Superview.Top).
Plus of course in the UIViewController that contains the UITableView uncheck "Adjust Scroll View Insets".
I have just removed UITableView
from Interface Builder
, created it once again and strange 35px gone away.
It seems that it there is a strange bug in Interface Builder
.
if you choose the style of UITableViewStyleGrouped,you need to implement the Header
and Footer
height delegate method,and the return value need greater than 0; like this:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
This is the solution for iOS 10 using Swift 3:
You can get rid of top and bottom paddings by implementing the following methods from the UITableViewDelegate
.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
Source: Stackoverflow.com