How do I set collection view's cell size via the auto layout

前端 未结 5 600
逝去的感伤
逝去的感伤 2020-12-05 07:45

Hi I\'m trying to resize the cell via the auto layout.

I want display the cell by the 3 by 3.

First Cell\'s margin left=0

Last Cell\'s m

相关标签:
5条回答
  • 2020-12-05 08:16

    Swift 3 version code based on vacawama answer:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    
            let cellsAcross: CGFloat = 3
            let spaceBetweenCells: CGFloat = 1
            let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross
    
            return CGSize(width: dim, height: dim)
        }
    
    0 讨论(0)
  • 2020-12-05 08:17

    Here is another solution but It only works on iPhone6.

    I will trying to update for iphone5/6plus

    Special thanks to @vacawama!

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    
    
            // Compute the dimension of a cell for an NxN layout with space S between
            // cells.  Take the collection view's width, subtract (N-1)*S points for
            // the spaces between the cells, and then divide by N to find the final
            // dimension for the cell's width and height.
    
            let cellsAcross: CGFloat = 3
            let spaceBetweenCells: CGFloat = 1
            let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross
                    print(indexPath.row)
    
            var width = dim
    
            //last cell's width
            if(  (indexPath.row + 1) % 3 == 0){
                width = 124
    
            }else {
                width = 124.5
            }
            print(width)
            return CGSizeMake(width, dim)
    
        }
    
        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1;
        }
    
        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1;
        }
    
    0 讨论(0)
  • 2020-12-05 08:31

    Great answer by vacawama but I had 2 issues. I wanted the spacing that I defined in storyboard to automatically be used.

    And secondly, I could not get this function to invoke and no one mentioned how? In order to invoke the collectionView's sizeForItemAt you need to extend UICollectionViewDelegateFlowLayout instead of extending UICollectionViewDelegate. I hope this saves someone else some time.

    extension MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let cellsAcross: CGFloat = 3
            var widthRemainingForCellContent = collectionView.bounds.width
            if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {
                let borderSize: CGFloat = flowLayout.sectionInset.left + flowLayout.sectionInset.right
                widthRemainingForCellContent -= borderSize + ((cellsAcross - 1) * flowLayout.minimumInteritemSpacing)
            }
            let cellWidth = widthRemainingForCellContent / cellsAcross
            return CGSize(width: cellWidth, height: cellWidth)
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 08:34

    I set it up using CollectionView's delegate methods. This will give you a 2xN setup but you can easily make it a 3xN instead. Here's a screenshot and you can refer to my project on GitHub...

    https://github.com/WadeSellers/GoInstaPro

    0 讨论(0)
  • I don't believe you can set the size by only using the Storyboard because you can't set constraints to recurring items like collection view cells that are created on the fly at runtime.

    You can easily compute the size from the information you are given. In collectionView(_:layout:sizeForItemAt:) you can access the bounds of the collectionView to compute the desired size of your cell:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // Compute the dimension of a cell for an NxN layout with space S between
        // cells.  Take the collection view's width, subtract (N-1)*S points for
        // the spaces between the cells, and then divide by N to find the final
        // dimension for the cell's width and height.
    
        let cellsAcross: CGFloat = 3
        let spaceBetweenCells: CGFloat = 1
        let dim = (collectionView.bounds.width - (cellsAcross - 1) * spaceBetweenCells) / cellsAcross
        return CGSize(width: dim, height: dim)
    }
    

    Make sure your class adopts the protocol UICollectionViewDelegateFlowLayout.

    This then works for iPhones and iPads of all sizes.

    0 讨论(0)
提交回复
热议问题