75

I want to put a UICollectionView control that shows thumbs horizontally (only a single line of thumbs). For some reason the UICollectionView push the thumbs 44 pixels down, so the "0" height is actually "44". I assume it might be adding this space to consider the navigation bar height (I just assume). Since my UICollectionView is only on part of the screen, I don't want this margin. Is there a way to remove it?

bashan
  • 3,572
  • 6
  • 41
  • 58
  • similar woe ? http://stackoverflow.com/questions/24916006/in-a-uicollectionview-the-cells-will-not-sit-on-the-bottom – Fattie Jul 23 '14 at 16:41

9 Answers9

195

The issue may be in collection view's content insets. Try to add self.automaticallyAdjustsScrollViewInsets = NO; into view controller's viewDidLoad method.

Sviatoslav Yakymiv
  • 7,887
  • 2
  • 23
  • 43
87

You can set this in the storyboard too.

Make sure you've selected the ViewController, and then untick "Adjust Scroll View Insets".

enter image description here

I haven't tested what this IB/Storyboard method does on iOS6 though. With the code method you need to check that the VC responds to the method:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
siburb
  • 4,880
  • 1
  • 25
  • 34
17

I found that adding:

self.edgesForExtendedLayout = UIRectEdgeNone;

In the view controller I was loading the UICollectionView in solved the problem as I couldn't get the accepted answer to work.

The question I found this answer to can be found here and provides an extremely in-depth and interesting explanation of the difference between automatically adjusted scrolled view insets, extended layouts and edge for extended layouts.

Well worth a read

Community
  • 1
  • 1
sam_smith
  • 6,023
  • 3
  • 43
  • 60
6

Swift 3:

First you want to set the viewControllers automaticallyAdjustsScrollViewInsets to false:

self.automaticallyAdjustsScrollViewInsets = false

Then, you should be able to adjust the edge insets accordingly:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    //top, left, bottom, right
    return UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
}
ArtSabintsev
  • 5,170
  • 10
  • 41
  • 71
Josh O'Connor
  • 4,694
  • 7
  • 54
  • 98
5

Maybe you can try to force this value at 0 using the Delegate flow layout of collection view :

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(PADDING_TOP, PADDING_LEFT, PADDING_BOTTOM, PADDING_RIGHT);
}

Modify the value of your padding.

Jordan Montel
  • 8,227
  • 2
  • 35
  • 40
1

As some others mentioned, viewController.automaticallyAdjustsScrollViewInsets has been deprecated since iOS 11. My solution...

Swift 4.2, Xcode 10.1, iOS 12.1:

For some reason, collectionView.contentSize.height was appearing smaller than the resolved height of my collection view. First, I was using an auto-layout constraint relative to 1/2 of the superview's height. To fix this, I changed the constraint to be relative to the "safe area" of the view.

This allowed me to set the cell height to vertically fill my collection view using collectionView.contentSize.height:

private func setCellSize() {
    let height: CGFloat = (collectionView.contentSize.height) / CGFloat(numberOfRows)
    let width: CGFloat = view.frame.width - CGFloat(horizontalCellMargin * 2)

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: width, height: height)
}

Before

height relative to superview bad collection view layout

After

height relative to safe area good collection view layout

Andrew Kirna
  • 1,346
  • 16
  • 18
1

Swift 5.2 / Xcode 11.3

viewController.automaticallyAdjustsScrollViewInsets 

has been deprecated since iOS 11.

My solution:

collectionView.contentInsetAdjustmentBehavior = .never
Abdurrahman
  • 6,306
  • 3
  • 19
  • 20
-1

Try using self.feedCollectionView.contentInsetAdjustmentBehavior = .never on the collection view. This actually worked for me.

Samarey
  • 722
  • 1
  • 7
  • 17
-3

Similar to @Sviatoslav answer, you can try the following:

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    yourCollectionView.contentOffset = CGPointMake(0, 0);
}
liviucmg
  • 1,310
  • 3
  • 18
  • 26