UICollectionView Set number of columns

后端 未结 17 1124
执笔经年
执笔经年 2020-11-28 17:28

I just started learning about UICollectionViews. I\'m wondering if anyone knows how to specify the number of columns in a collectionview. The default is set to 3 (iPhone/por

相关标签:
17条回答
  • 2020-11-28 18:13

    Because UICollectionView is so flexible, there are multiple ways you could change the number of columns, depending on the kind of layout you use.

    The UICollectionViewFlowLayout (which is probably what you're working with) doesn't specify a number of columns directly (because it depends on the view size/orientation). The easiest way to change it would be to set the itemSize property and/or minimumInteritemSpacing/minimumLineSpacing.

    0 讨论(0)
  • 2020-11-28 18:13

    Try This,It's working perfect for me,

    Follow below steps:

    1. Define values in .h file.

         #define kNoOfColumsForCollection 3
         #define kNoOfRowsForCollection 4
         #define kcellSpace 5
         #define kCollectionViewCellWidth (self.view.frame.size.width - kcellSpace*kNoOfColumsForCollection)/kNoOfColumsForCollection
         #define kCollectionViewCellHieght (self.view.frame.size.height-40- kcellSpace*kNoOfRowsForCollection)/kNoOfRowsForCollection
    

    OR

      #define kNoOfColumsForCollection 3
      #define kCollectionViewCellWidthHieght (self.view.frame.size.width - 6*kNoOfColumsForCollection)/kNoOfColumsForCollection
    

    2.Add Code in collection View Layout data source methods as below,

     #pragma mark Collection View Layout data source methods
    // collection view with autolayout
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
    {
    return 4;
    }
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
     {
     return 1;
    }
    
    - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
    {
    return UIEdgeInsetsMake(4, 4, 4, 4);
    }
    - (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
       sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
     return 
     CGSizeMake(kCollectionViewCellWidth,kCollectionViewCellHieght);
     // CGSizeMake (kCollectionViewCellWidthHieght,kCollectionViewCellWidthHieght);
    }
    

    Hope this will be help for some one.

    0 讨论(0)
  • 2020-11-28 18:14

    Its all about layout you want to draw. You can create custom class inheriting from UICollectionViewFlowLayout. Currently there is not any direct method to set columns. If you want to achieve this kind of functionality you need to do it manually. You need to handle it in your custom flow layout class.

    Now question will arise how you will do it? If you dont want to disturb cell frame you can adjust

     collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
     collectionView:layout:minimumLineSpacingForSectionAtIndex:
    

    Another way is provide you own positions of cells. By overriding below two methods, which will get called during your layout formation.

      - (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
      - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path
    

    UICollectionViewLayoutAttributes is class which will deal with cell position, frame, Zindex etc

    0 讨论(0)
  • 2020-11-28 18:16

    I implemented UICollectionViewDelegateFlowLayout on my UICollectionViewController and override the method responsible for determining the size of the Cell. I then took the screen width and divided it with my column requirement. For example, I wanted to have 3 columns on each screen size. So here's what my code looks like -

    - (CGSize)collectionView:(UICollectionView *)collectionView
                      layout:(UICollectionViewLayout *)collectionViewLayout
      sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        CGFloat screenWidth = screenRect.size.width;
        float cellWidth = screenWidth / 3.0; //Replace the divisor with the column count requirement. Make sure to have it in float.
        CGSize size = CGSizeMake(cellWidth, cellWidth);
    
        return size;
    }
    
    0 讨论(0)
  • 2020-11-28 18:25

    This answer is for swift 3.0 -->

    first conform to the protocol :

     UICollectionViewDelegateFlowLayout
    

    then add these methods :

        //this method is for the size of items      
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let width = collectionView.frame.width/3
            let height : CGFloat = 160.0
            return CGSize(width: width, height: height)
        }
        //these methods are to configure the spacing between items
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
            return UIEdgeInsetsMake(0,0,0,0)
        }
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
            return 0
        }
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 0
        }
    
    0 讨论(0)
  • 2020-11-28 18:26

    the perfect solution is to Using UICollectionViewDelegateFlowLayout but you can easily so calculate the cell width and divided on the wanted number of columns you want

    the tricky is to make the width with no fraction

    (UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    
    {
     CGFloat screenWidth = self.view.frame.size.width;
       CGFloat marginWidth = (screenWidth - collectionView.frame.size.width);
    
    
       CGFloat cellWith = (collectionView.frame.size.width - marginWidth )/3;
       cellWith= floorf(cellWith);
    
    
    
    
      CGSize retval = CGSizeMake(cellWith,cellWith);
    
    
      return retval;}
    
    0 讨论(0)
提交回复
热议问题