Расстояние между ячейками в UICollectionView

Как установить интервал между ячейками в разделе UICollectionView? Я знаю, что есть свойство minimumInteritemSpacing Я установил его в 5.0, но интервал не появляется 5.0. Я реализовал метод делегирования потока.

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{

    return 5.0;
}

По-прежнему я не получаю желаемого результата. Я думаю, что это минимальный интервал. Нет ли способа, с помощью которого можно установить максимальный интервал?

simulator sc

Ответ 1

Я знаю, что тема старая, но если кому-то все еще нужен правильный ответ, то что вам нужно:

  • Отменить стандартную раскладку потока.
  • Добавьте реализацию следующим образом:

    - (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
        NSArray *answer = [super layoutAttributesForElementsInRect:rect];
    
        for(int i = 1; i < [answer count]; ++i) {
            UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
            UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
            NSInteger maximumSpacing = 4;
            NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);
    
            if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {
                CGRect frame = currentLayoutAttributes.frame;
                frame.origin.x = origin + maximumSpacing;
                currentLayoutAttributes.frame = frame;
            }
        }
        return answer;
    }
    

где maximumSpacing может быть установлено на любое значение, которое вы предпочитаете. Этот трюк гарантирует, что пространство между ячейками будет ТОЧНО равным максимальномуSpacing!!

Ответ 2

Поддержка начального вопроса. Я попытался получить интервал 5px на UICollectionView, но это не сработает, а с помощью UIEdgeInsetsMake(0,0,0,0)...

В UITableView я могу сделать это, непосредственно указав координаты x, y в строке...

enter image description here

Вот мой код UICollectionView:

#pragma mark collection view cell layout / size
- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [self getCellSize:indexPath];  // will be w120xh100 or w190x100
    // if the width is higher, only one image will be shown in a line
}

#pragma mark collection view cell paddings
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 0, 0, 0); // top, left, bottom, right
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

    return 5.0;
}

Обновление: решила мою проблему со следующим кодом.

enter image description here

ViewController.m

#import "ViewController.h"
#import "MagazineCell.h" // created just the default class. 

static NSString * const cellID = @"cellID";

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Collection view
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 30;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MagazineCell *mCell = (MagazineCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

    mCell.backgroundColor = [UIColor lightGrayColor];

    return mCell;
}

#pragma mark Collection view layout things
// Layout: Set cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"SETTING SIZE FOR ITEM AT INDEX %d", indexPath.row);
    CGSize mElementSize = CGSizeMake(104, 104);
    return mElementSize;
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

// Layout: Set Edges
- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
   // return UIEdgeInsetsMake(0,8,0,8);  // top, left, bottom, right
    return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right
}

@end

Ответ 3

Используя горизонтальный макет потока, я также получал 10-точечный интервал между ячейками. Чтобы удалить интервал, мне нужно было установить minimumLineSpacing, а также minimumInterItemSpacing на ноль.

UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
flow.itemSize = CGSizeMake(cellWidth, cellHeight);
flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;
flow.minimumInteritemSpacing = 0;
flow.minimumLineSpacing = 0;

Кроме того, если все ваши ячейки имеют одинаковый размер, проще и эффективнее устанавливать свойство в макете потока непосредственно вместо использования методов делегатов.

Ответ 4

Помните, это минимальный интервал между строками, а не минимальный интервал между элементами или ячейкой. Потому что ваше направление прокрутки collectionView - ГОРИЗОНТАЛЬНОЕ.

Если он был вертикальным, то вам нужно установить пространство ячеек или пространство между элементами для горизонтального пространства между ячейками и межстрочный интервал для вертикального пространства между ячейками.

Версия Objective-C

- (CGFloat)collectionView:(UICollectionView *)collectionView
                       layout:(UICollectionViewLayout*)collectionViewLayout
    minimumLineSpacingForSectionAtIndex:(NSInteger)section
    {
        return 20;
    }

Swift версия:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 20
}

Ответ 5

Попробуйте этот код, чтобы обеспечить промежуток между 5 пунктами между пунктами:

- (UIEdgeInsets)collectionView:(UICollectionView *) collectionView 
                        layout:(UICollectionViewLayout *) collectionViewLayout 
        insetForSectionAtIndex:(NSInteger) section {

    return UIEdgeInsetsMake(0, 0, 0, 5); // top, left, bottom, right
}

- (CGFloat)collectionView:(UICollectionView *) collectionView
                   layout:(UICollectionViewLayout *) collectionViewLayout
  minimumInteritemSpacingForSectionAtIndex:(NSInteger) section {    
    return 5.0;
}

Ответ 6

Быстрая версия самого популярного ответа. Пространство между ячейками будет равно cellSpacing.

class CustomViewFlowLayout : UICollectionViewFlowLayout {

    let cellSpacing:CGFloat = 4

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        if let attributes = super.layoutAttributesForElementsInRect(rect) {
        for (index, attribute) in attributes.enumerate() {
                if index == 0 { continue }
                let prevLayoutAttributes = attributes[index - 1]
                let origin = CGRectGetMaxX(prevLayoutAttributes.frame)
                if(origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize().width) {
                    attribute.frame.origin.x = origin + cellSpacing
                }
            }
            return attributes
        }
        return nil
    }
}

Ответ 7

Я нашел очень простой способ настроить интервал между ячейками или строками с помощью IB.

Просто выберите UICollectionView из файла раскадровки /Xib и нажмите Inspector размера, как показано на рисунке ниже.

введите описание изображения здесь

Для конфигурирования пространства программно используйте следующие свойства.

1) Для установки пробела между строками.

[self.collectionView setMinimumLineSpacing:5];

2) Для установки пробела между элементами/ячейками.

[self.collectionView setMinimumInteritemSpacing:5];

Ответ 8

Обратите внимание на имя свойства minimumInterItemSpacing. Это будет минимальный интервал между элементами , а не точным интервалом. Если вы установите для параметра minimumInterItemSpacing какое-то значение, вы можете убедиться, что интервал не будет меньше значения. Но есть шанс получить более высокую ценность.

Фактически, расстояние между элементами зависит от нескольких факторов itemSize и sectionInset. В представлении коллекции динамически размещайте содержимое на основе этих значений. Поэтому вы не можете гарантировать точное расстояние. Вы должны выполнить пробную и пробную версию с sectionInset и minimumInterItemSpacing.

Ответ 9

Ответ для Swift 3.0, Xcode 8

1.Убедитесь, что вы установили делегат представления коллекций

class DashboardViewController: UIViewController {
    @IBOutlet weak var dashboardCollectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        dashboardCollectionView.delegate = self
    }
}

2.Implement UICollectionViewDelegateFlowLayout, а не UICollectionViewDelegate.

extension DashboardViewController: UICollectionViewDelegateFlowLayout {
    fileprivate var sectionInsets: UIEdgeInsets {
        return .zero
    }

    fileprivate var itemsPerRow: CGFloat {
        return 2
    }

    fileprivate var interitemSpace: CGFloat {
        return 5.0
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
        let sectionPadding = sectionInsets.left * (itemsPerRow + 1)
        let interitemPadding = max(0.0, itemsPerRow - 1) * interitemSpace
        let availableWidth = collectionView.bounds.width - sectionPadding - interitemPadding
        let widthPerItem = availableWidth / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        insetForSectionAt section: Int) -> UIEdgeInsets {
        return sectionInsets
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return interitemSpace
    }
}

Ответ 10

Определите протокол UICollectionViewDelegateFlowLayout в своем файле заголовка.

Внедрите следующий метод протокола UICollectionViewDelegateFlowLayout следующим образом:

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

Щелкните здесь, чтобы увидеть документацию Apple по методу UIEdgeInsetMake.

Ответ 11

Проголосовавший ответ (а также быстрая версия) имеет небольшую проблему: будет большой интервал справа.

Это связано с тем, что макет потока настроен так, чтобы сделать расстояние между ячейками точным, с поведением с поплавком.

Мое решение состоит в том, чтобы манипулировать вставкой раздела, чтобы раздел был центрирован, но интервал точно соответствует указанному.

В скриншоте ниже, расстояние между пунктами/линиями равно 8pt, а вставка слева и справа будет больше 8pt (чтобы сделать выравнивание по центру):

равномерно распределенные ячейки

Код Swift как таковой:

private let minItemSpacing: CGFloat = 8
private let itemWidth: CGFloat      = 100
private let headerHeight: CGFloat   = 32

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Create our custom flow layout that evenly space out the items, and have them in the center
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
    layout.minimumInteritemSpacing = minItemSpacing
    layout.minimumLineSpacing = minItemSpacing
    layout.headerReferenceSize = CGSize(width: 0, height: headerHeight)

    // Find n, where n is the number of item that can fit into the collection view
    var n: CGFloat = 1
    let containerWidth = collectionView.bounds.width
    while true {
        let nextN = n + 1
        let totalWidth = (nextN*itemWidth) + (nextN-1)*minItemSpacing
        if totalWidth > containerWidth {
            break
        } else {
            n = nextN
        }
    }

    // Calculate the section inset for left and right. 
    // Setting this section inset will manipulate the items such that they will all be aligned horizontally center.
    let inset = max(minItemSpacing, floor( (containerWidth - (n*itemWidth) - (n-1)*minItemSpacing) / 2 ) )
    layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset)

    collectionView.collectionViewLayout = layout
}

Ответ 12

Простой код для пробелов

let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.minimumInteritemSpacing = 10 // Some float value

Ответ 13

Я использую monotouch, поэтому имена и код будут немного разными, но вы можете сделать это, убедившись, что ширина представления коллекции равна (ширина ячейки x *) + (x-1) * MinimumSpacing с x = количество ячеек в строке.

Просто выполните следующие шаги, основанные на вашей минимальной ширине и ширине ячейки

1) Мы вычисляем количество элементов в строке на основе размера ячейки + текущие вставки + минимальный интервал

float currentTotalWidth = CollectionView.Frame.Width - Layout.SectionInset.Left - Layout.SectionInset.Right (Layout = flowlayout)
int amountOfCellsPerRow = (currentTotalWidth + MinimumSpacing) / (cell width + MinimumSpacing)

2) Теперь у вас есть вся информация для расчета ожидаемой ширины для вида коллекции

float totalWidth =(amountOfCellsPerRow * cell width) + (amountOfCellsPerRow-1) * MinimumSpacing

3) Таким образом, разница между текущей шириной и ожидаемой шириной равна

float difference = currentTotalWidth - totalWidth;

4) Теперь отредактируйте вставки (в этом примере мы добавим его вправо, поэтому левая позиция коллекции будет оставаться той же

Layout.SectionInset.Right = Layout.SectionInset.Right + difference;

Ответ 14

Я наткнулся на аналогичную проблему, как OP. К сожалению, принятый ответ не сработал у меня, так как содержимое collectionView не будет правильно центрировано. Поэтому я придумал другое решение, которое требует, чтобы все элементы в collectionView имели ту же ширину, что, похоже, имеет место в вопросе:

#define cellSize 90

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    float width = collectionView.frame.size.width;
    float spacing = [self collectionView:collectionView layout:collectionViewLayout minimumInteritemSpacingForSectionAtIndex:section];
    int numberOfCells = (width + spacing) / (cellSize + spacing);
    int inset = (width + spacing - numberOfCells * (cellSize + spacing) ) / 2;

    return UIEdgeInsetsMake(0, inset, 0, inset);
}

Этот код гарантирует, что значение, возвращаемое ...minimumInteritemSpacing..., будет точным расстоянием между каждым collectionViewCell и, кроме того, гарантирует, что все ячейки будут центрироваться в collectionView

Ответ 15

выше решение vojtech-vrbka является правильным, но оно вызывает предупреждение:

предупреждение: UICollectionViewFlowLayout имеет несоответствие кэшированных кадров для пути к индексу - кэшированное значение: это, вероятно, происходит потому, что макет подкласса макета потока изменяет атрибуты, возвращаемые UICollectionViewFlowLayout, не копируя их

Следующий код должен исправить:

class CustomViewFlowLayout : UICollectionViewFlowLayout {

   let cellSpacing:CGFloat = 4

   override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
       let original = super.layoutAttributesForElementsInRect(rect)

       if let original = original {
           let attributes = NSArray.init(array: original, copyItems: true) as! [UICollectionViewLayoutAttributes]

           for (index, attribute) in attributes.enumerate() {
                if index == 0 { continue }
                let prevLayoutAttributes = attributes[index - 1]
                let origin = CGRectGetMaxX(prevLayoutAttributes.frame)
                if(origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize().width) {
                    attribute.frame.origin.x = origin + cellSpacing
                }
            }
            return attributes
       }
       return nil
   }
}

Ответ 16

версия Swift 3

Просто создайте подкласс UICollectionViewFlowLayout и вставьте этот метод.

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let answer = super.layoutAttributesForElements(in: rect) else { return nil }

        for i in 1..<answer.count {
            let currentAttributes = answer[i]
            let previousAttributes = answer[i - 1]

            let maximumSpacing: CGFloat = 8
            let origin = previousAttributes.frame.maxX

            if (origin + maximumSpacing + currentAttributes.frame.size.width < self.collectionViewContentSize.width && currentAttributes.frame.origin.x > previousAttributes.frame.origin.x) {
                var frame = currentAttributes.frame
                frame.origin.x = origin + maximumSpacing
                currentAttributes.frame = frame
            }
        }

        return answer
}

Ответ 17

Если вы хотите настроить интервал, не касаясь фактического размера ячейки, это решение, которое наилучшим образом подходит для меня. #xcode 9 # tvOS11 # iOS11 #swift

Итак, в UICollectionViewDelegateFlowLayout, измените реализацию следующих методов, трюк у вас должен использовать оба из них, и документация на самом деле не указывала мне думать в этом направлении.: D

open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return cellSpacing
}

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return cellSpacing
}

Ответ 18

Я попробовал iago849 ответить, и это сработало.

Swift 4

open override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    guard let answer = super.layoutAttributesForElements(in: rect) else {
        return nil
    }
    let count = answer.count
    for i in 1..<count {
        let currentLayoutAttributes = answer[i]
        let prevLayoutAttributes = answer[i-1]
        let origin = prevLayoutAttributes.frame.maxX
        if (origin + CGFloat(spacing) + currentLayoutAttributes.frame.size.width) < self.collectionViewContentSize.width && currentLayoutAttributes.frame.origin.x > prevLayoutAttributes.frame.origin.x {
            var frame = currentLayoutAttributes.frame
            frame.origin.x = origin + CGFloat(spacing)
            currentLayoutAttributes.frame = frame
        }
    }
    return answer
}

Вот ссылка на проект GitHub. https://github.com/vishalwaka/MultiTags

Ответ 19

У меня есть горизонтальный UICollectionView и подклассом UICollectionViewFlowLayout. Вид коллекции имеет большие ячейки и отображает только один ряд из них за раз, а представление коллекции соответствует ширине экрана.

Я попробовал ответить iago849, и это сработало, но потом я узнал, что мне даже не нужен его ответ. По какой-то причине установка minimumInterItemSpacing ничего не делает. Расстояние между моими элементами/ячейками можно полностью контролировать с помощью minimumLineSpacing.

Не уверен, почему он работает таким образом, но он работает.

Ответ 20

Предыдущие версии действительно не работали с разделами > 1. Итак, мое решение было найдено здесь https://codentrick.com/create-a-tag-flow-layout-with-uicollectionview/. Для ленивых:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
    var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()
    // use a value to keep track of left margin
    var leftMargin: CGFloat = 0.0;
    for attributes in attributesForElementsInRect! {
        let refAttributes = attributes 
        // assign value if next row
        if (refAttributes.frame.origin.x == self.sectionInset.left) {
            leftMargin = self.sectionInset.left
        } else {
            // set x position of attributes to current margin
            var newLeftAlignedFrame = refAttributes.frame
            newLeftAlignedFrame.origin.x = leftMargin
            refAttributes.frame = newLeftAlignedFrame
        }
        // calculate new value for current margin
        leftMargin += refAttributes.frame.size.width + 10
        newAttributesForElementsInRect.append(refAttributes)
    }

    return newAttributesForElementsInRect
}

Ответ 21

У меня проблема с принятым ответом, поэтому я обновил его, это работает для меня:

.h

@interface MaxSpacingCollectionViewFlowLayout : UICollectionViewFlowLayout
@property (nonatomic,assign) CGFloat maxCellSpacing;
@end

ого

@implementation MaxSpacingCollectionViewFlowLayout

- (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

    if (attributes.count <= 0) return attributes;

    CGFloat firstCellOriginX = ((UICollectionViewLayoutAttributes *)attributes[0]).frame.origin.x;

    for(int i = 1; i < attributes.count; i++) {
        UICollectionViewLayoutAttributes *currentLayoutAttributes = attributes[i];
        if (currentLayoutAttributes.frame.origin.x == firstCellOriginX) { // The first cell of a new row
            continue;
        }

        UICollectionViewLayoutAttributes *prevLayoutAttributes = attributes[i - 1];
        CGFloat prevOriginMaxX = CGRectGetMaxX(prevLayoutAttributes.frame);
        if ((currentLayoutAttributes.frame.origin.x - prevOriginMaxX) > self.maxCellSpacing) {
            CGRect frame = currentLayoutAttributes.frame;
            frame.origin.x = prevOriginMaxX + self.maxCellSpacing;
            currentLayoutAttributes.frame = frame;
        }
    }
    return attributes;
}

@end

Ответ 22

Мое решение в Swift 3 расстоянии между ячейками, как в Instagram:

введите описание изображения здесь

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
    cv.backgroundColor = UIColor.rgb(red: 227, green: 227, blue: 227)
    cv.showsVerticalScrollIndicator = false
    layout.scrollDirection = .vertical
    layout.minimumLineSpacing = 1
    layout.minimumInteritemSpacing = 1
    return cv
}()

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    switch UIDevice.current.modelName {
    case "iPhone 4":
        return CGSize(width: 106, height: 106)
    case "iPhone 5":
        return CGSize(width: 106, height: 106)
    case "iPhone 6,7":
        return CGSize(width: 124, height: 124)
    case "iPhone Plus":
        return CGSize(width: 137, height: 137)
    default:
        return CGSize(width: frame.width / 3, height: frame.width / 3)
    }
}

Как определить программное обеспечение устройства: fooobar.com/questions/14935/...

Ответ 23

Подход раскадровки

Выберите CollectionView в вашей раскадровке и перейдите к инспектору размера и установите минимальный интервал для ячеек и линий равным 5

Swift 5 программно

lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal

        //Provide Width and Height According to your need
        let width = UIScreen.main.bounds.width / 4
        let height = UIScreen.main.bounds.height / 10
        layout.itemSize = CGSize(width: width, height: height)

        //For Adjusting the cells spacing
        layout.minimumInteritemSpacing = 5
        layout.minimumLineSpacing = 5

        return UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    }()

Ответ 24

Попробуйте сыграть с этим методом:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView
                    layout:(UICollectionViewLayout*)collectionViewLayout
    insetForSectionAtIndex:(NSInteger)section {

    UIEdgeInsets insets = UIEdgeInsetsMake(?, ?, ?, ?);

    return insets;
}