UICollectionView spacing margins

后端 未结 15 968
一向
一向 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:17

    Set the insetForSectionAt property of the UICollectionViewFlowLayout object attached to your UICollectionView

    Make sure to add this protocol

    UICollectionViewDelegateFlowLayout
    

    Swift

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

    Objective - C

    - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
        return UIEdgeInsetsMake(top, left, bottom, right);
    }
    
    0 讨论(0)
  • 2020-11-30 17:18

    Using collectionViewFlowLayout.sectionInset or collectionView:layout:insetForSectionAtIndex: are correct.

    However, if your collectionView has multiple sections and you want to add margin to the whole collectionView, I recommend to use the scrollView contentInset :

    UIEdgeInsets collectionViewInsets = UIEdgeInsetsMake(50.0, 0.0, 30.0, 0.0);
    self.collectionView.contentInset = collectionViewInsets;
    self.collectionView.scrollIndicatorInsets = UIEdgeInsetsMake(collectionViewInsets.top, 0, collectionViewInsets.bottom, 0);
    
    0 讨论(0)
  • 2020-11-30 17:26

    You can use the collectionView:layout:insetForSectionAtIndex: method for your UICollectionView or set the sectionInset property of the UICollectionViewFlowLayout object attached to your UICollectionView:

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

    or

    UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];
    

    Updated for Swift 5

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
           return UIEdgeInsets(top: 25, left: 15, bottom: 0, right: 5)
        }
    
    0 讨论(0)
  • 2020-11-30 17:26

    Swift 4

        let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout 
        // If you create collectionView programmatically then just create this flow by UICollectionViewFlowLayout() and init a collectionView by this flow.
    
        let itemSpacing: CGFloat = 3
        let itemsInOneLine: CGFloat = 3
        flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    
        //collectionView.frame.width is the same as  UIScreen.main.bounds.size.width here.
        let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1) 
        flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
        flow.minimumInteritemSpacing = 3
        flow.minimumLineSpacing = itemSpacing
    

    EDIT

    XCode 11.4 and swift 5

    let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    

    doesn't work. Use below works.

    let flow = UICollectionViewFlowLayout()

    and after configuration:

    collectionView.collectionViewLayout = flow

    And if you want to change to scrollDirction horizontally:

    flow.scrollDirection = .horizontal

    NOTE

    If you set items in one lines isn't correctly, check if your collection view has paddings. That is:

    let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1)

    should be the collectionView width.

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

    In swift 4 and autoLayout, you can use sectionInset like this:

    let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .vertical
            layout.itemSize = CGSize(width: (view.frame.width-40)/2, height: (view.frame.width40)/2) // item size
            layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10) // here you can add space to 4 side of item
            collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) // set layout to item
            collectionView?.register(ProductCategoryCell.self, forCellWithReuseIdentifier: cellIdentifier) // registerCell
            collectionView?.backgroundColor = .white // background color of UICollectionView
            view.addSubview(collectionView!) // add UICollectionView to view
    
    0 讨论(0)
  • 2020-11-30 17:29

    To put space between CollectionItems use this

    write this two Line in viewdidload

    UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
    collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
    
    0 讨论(0)
提交回复
热议问题