UICollectionView spacing margins

后端 未结 15 969
一向
一向 2020-11-30 16:58

I have a UICollectionView which shows photos. I have created the collectionview using UICollectionViewFlowLayout. It works good but I would like to

相关标签:
15条回答
  • 2020-11-30 17:31

    In Objective-C

    CGFloat spacing = 5;
    UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)_habbitCollectionV.collectionViewLayout;
    flow.sectionInset = UIEdgeInsetsMake(0, spacing, 0, spacing);
    CGFloat itemsPerRow = 2;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat oneMore = itemsPerRow + 1;
    CGFloat width = screenRect.size.width - spacing * oneMore;
    CGFloat height = width / itemsPerRow;
    
    flow.itemSize = CGSizeMake(floor(height), height);
    flow.minimumInteritemSpacing = spacing;
    flow.minimumLineSpacing = spacing;
    

    All you have to do is change the itemsPerRow value and it will update the number of items per row accordingly. Furthermore, you can change the spacing value if you want more or less general spacing.

    0 讨论(0)
  • 2020-11-30 17:32

    To add spacing on the entire UICollectionView:

    UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
    flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
    

    To play with the spacing between elements of the same row (column if you're scrolling horizontally), and their sizes:

    flow.itemSize = ...;
    flow.minimumInteritemSpacing = ...;
    
    0 讨论(0)
  • 2020-11-30 17:32

    use setMinimumLineSpacing: and setMinimumInteritemSpacing: on the UICollectionViewFlowLayout-Object.

    0 讨论(0)
  • 2020-11-30 17:35

    Just to correct some wrong information in this page:

    1- minimumInteritemSpacing: The minimum spacing to use between items in the same row.

    The default value: 10.0.

    (For a vertically scrolling grid, this value represents the minimum spacing between items in the same row.)

    2- minimumLineSpacing : The minimum spacing to use between lines of items in the grid.

    Ref: http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewFlowLayout_class/Reference/Reference.html

    0 讨论(0)
  • 2020-11-30 17:38

    To add 10px separation between each section just write this

    flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);
    
    0 讨论(0)
  • 2020-11-30 17:39

    Modern Swift, Automatic Layout Calculation

    While this thread already contains a bunch of useful answers, I want to add a modern Swift version, based on William Hu's answer. It also improves two things:

    • The spacing between different lines will now always match the spacing between items in the same line.
    • By setting a minimum width, the code automatically calculates the number of items in a row and applies that style to the flow layout.

    Here's the code:

    // Create flow layout
    let flow = UICollectionViewFlowLayout()
    
    // Define layout constants
    let itemSpacing: CGFloat = 1
    let minimumCellWidth: CGFloat = 120
    let collectionViewWidth = collectionView!.bounds.size.width
    
    // Calculate other required constants
    let itemsInOneLine = CGFloat(Int((collectionViewWidth - CGFloat(Int(collectionViewWidth / minimumCellWidth) - 1) * itemSpacing) / minimumCellWidth))
    let width = collectionViewWidth - itemSpacing * (itemsInOneLine - 1)
    let cellWidth = floor(width / itemsInOneLine)
    let realItemSpacing = itemSpacing + (width / itemsInOneLine - cellWidth) * itemsInOneLine / max(1, itemsInOneLine - 1))
    
    // Apply values
    flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    flow.itemSize = CGSize(width: cellWidth, height: cellWidth)
    flow.minimumInteritemSpacing = realItemSpacing
    flow.minimumLineSpacing = realItemSpacing
    
    // Apply flow layout
    collectionView?.setCollectionViewLayout(flow, animated: false)
    
    0 讨论(0)
提交回复
热议问题