首页 文章

如何设置单元格间距和UICollectionView - UICollectionViewFlowLayout大小比例?

提问于
浏览
108

我正在尝试将 UICollectionView 添加到 ViewController ,我需要有3个单元格'per row',单元格之间没有空格(它应该看起来像一个网格) . 单元格宽度应该是屏幕尺寸的三分之一,所以我认为 layout.item 宽度应该相同 . 但后来我明白了:

layout.itemSize width = screenSize.width/3

如果我减小那个尺寸(例如7或8像素),那就更好了,但是行中的第三个单元格不是完全可见的,我仍然有那个空白区域(顶部和底部,左侧和右侧) .

enter image description here

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
    var collectionView: UICollectionView?
    var screenSize: CGRect!
    var screenWidth: CGFloat!
    var screenHeight: CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()

        screenSize = UIScreen.mainScreen().bounds
        screenWidth = screenSize.width
        screenHeight = screenSize.height

        // Do any additional setup after loading the view, typically from a nib
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
        layout.itemSize = CGSize(width: screenWidth / 3, height: screenWidth / 3)
        collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        collectionView!.dataSource = self
        collectionView!.delegate = self
        collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
        collectionView!.backgroundColor = UIColor.greenColor()
        self.view.addSubview(collectionView!)
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as CollectionViewCell
        cell.backgroundColor = UIColor.whiteColor()
        cell.layer.borderColor = UIColor.blackColor().CGColor
        cell.layer.borderWidth = 0.5
        cell.frame.size.width = screenWidth / 3
        cell.frame.size.height = screenWidth / 3

        cell.textLabel?.text = "\(indexPath.section):\(indexPath.row)"
        return cell
    }
}

8 回答

  • 2

    添加这两行

    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    

    所以你有了:

    // Do any additional setup after loading the view, typically from a nib.
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
            layout.itemSize = CGSize(width: screenWidth/3, height: screenWidth/3)
            layout.minimumInteritemSpacing = 0
            layout.minimumLineSpacing = 0
            collectionView!.collectionViewLayout = layout
    

    这将删除所有空格并为您提供网格布局:

    enter image description here

    如果您希望第一列的宽度等于屏幕宽度,请添加以下函数:

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        if indexPath.row == 0
        {
            return CGSize(width: screenWidth, height: screenWidth/3)
        }
        return CGSize(width: screenWidth/3, height: screenWidth/3);
    
    }
    

    网格布局现在看起来像(我还为第一个单元格添加了蓝色背景):
    enter image description here

  • 248

    For Swift 3 and XCode 8 ,这很有效 . 按照以下步骤实现此目的: -

    {
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        let width = UIScreen.main.bounds.width
        layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
        layout.itemSize = CGSize(width: width / 2, height: width / 2)
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        collectionView!.collectionViewLayout = layout
    }
    

    将此代码放入viewDidLoad()函数中 .

  • 4

    在某些情况下,在 viewDidLoadViewWillAppear 中设置 UICollectionViewFlowLayout 可能不会对collectionView产生影响 .

    viewDidAppear 中设置 UICollectionViewFlowLayout 可能会导致在运行时看到单元格大小的更改 .

    另一个解决方案,在Swift 3中:

    extension YourViewController : UICollectionViewDelegateFlowLayout{
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
            return UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
        }
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let collectionViewWidth = collectionView.bounds.width
            return CGSize(width: collectionViewWidth/3, height: collectionViewWidth/3)
        }
    
        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 20
        }
    }
    
  • 16

    如果您正在寻找Swift 3,请按照以下步骤来实现:

    func viewDidLoad() {
    
        //Define Layout here
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
        //Get device width
        let width = UIScreen.main.bounds.width
    
        //set section inset as per your requirement.
        layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
    
        //set cell item size here 
        layout.itemSize = CGSize(width: width / 2, height: width / 2)
    
        //set Minimum spacing between 2 items
        layout.minimumInteritemSpacing = 0
    
        //set minimum vertical line spacing here between two lines in collectionview
        layout.minimumLineSpacing = 0
    
        //apply defined layout to collectionview
        collectionView!.collectionViewLayout = layout
    
    }
    

    这在使用Swift 3的Xcode 8.0上得到验证 .

  • 23
    let layout = myCollectionView.collectionViewLayout as? UICollectionViewFlowLayout
    layout?.minimumLineSpacing = 8
    
  • 4

    Swift 4

    let collectionViewLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
    collectionViewLayout?.sectionInset = UIEdgeInsetsMake(0, 20, 0, 40) 
    collectionViewLayout?.invalidateLayout()
    
  • 40

    For Swift 3 and XCode 8, 这个有效 . 按照以下步骤实现此目的: -

    viewDidLoad()
        {
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            var width = UIScreen.main.bounds.width
            layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
        width = width - 10
        layout.itemSize = CGSize(width: width / 2, height: width / 2)
            layout.minimumInteritemSpacing = 0
            layout.minimumLineSpacing = 0
            collectionView!.collectionViewLayout = layout
        }
    
  • 0

    对于Swift 3和Xcode 9尝试使用它

    extension ViewController: UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    
        let collectionWidth = collectionView.bounds.width
        return CGSize(width: collectionWidth/3, height: collectionWidth/3)
    
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    
    }
    

相关问题