UIcollectionView 间距

Posted

技术标签:

【中文标题】UIcollectionView 间距【英文标题】:UIcollectionView Spacing 【发布时间】:2016-08-25 05:09:41 【问题描述】:

我有 10 个单元格,其中第 6 个单元格的宽度必须与其他单元格不同。我尝试在流委托方法中更改它。但是从第 7 个到第 10 个单元格的间距出了点问题。

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

    let widthOfCollectionView  = collectionView.bounds.width - 40;

 // For collectionView use "item" instead of "row" 
    if indexPath.item == 6
        return CGSizeMake(widthOfCollectionView,100)
    else
        return CGSizeMake(widthOfCollectionView/3, 100)
    


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat 

    return 10;


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat 
    return 10;


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets

    return UIEdgeInsetsMake(5, 5, 5, 5);

【问题讨论】:

请检查我的编辑。 【参考方案1】:

我对你的代码做了如下修改:

 import UIKit

    class ViewController: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate  

        @IBOutlet weak var sampleCollectionView: UICollectionView!

        let reuseIdentifier = "cell"

        let insetValue: CGFloat = 5.0

        override func viewDidLoad() 
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        

        override func didReceiveMemoryWarning() 
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        

        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
            return 10
        

        // make a cell for each cell index path
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 

            // get a reference to our storyboard cell
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
            // Use the outlet in our custom class to get a reference to the UILabel in the cell

            return cell
        

        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

            if indexPath.item == 6
                return CGSizeMake(collectionView.bounds.width - insetValue * 2,100)
            else
                return CGSizeMake(floor((collectionView.bounds.width - insetValue * 4)/3), 100)
            
        

        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat 

            return insetValue;
        

        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat 
            return insetValue;
        

        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets

            return UIEdgeInsetsMake(insetValue, insetValue, insetValue, insetValue);
        


    

最终输出:

要下载示例项目,请使用以下链接:

https://github.com/k-sathireddy/SampleCollectionView

【讨论】:

你能告诉我它如何在所有方面都适用于 UIEdgeInset 10。我试过了,同样的计算不起作用。 我会修改并回复你​​ 请检查...我编辑了我的答案..现在您可以将“insetValue”更改为您想要的任何值..【参考方案2】:

对于小项目的宽度,您应该返回(collectionView.bounds.width - 30)/3,左侧插图为 5,右侧插图为 5,间距 = 30 为 2*10。 对于大项目的宽度,您应该返回collectionView.bounds.width - 10,左侧为 5,右侧插入为 5 = 10。

你可以替换这个

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

    let widthOfCollectionView  = collectionView.bounds.width - 40;
    if indexPath.item == 6
        return CGSizeMake(widthOfCollectionView,100)
    else
        return CGSizeMake(widthOfCollectionView/3, 100)
    

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

    let smallItemWidth = floor((collectionView.bounds.width - 30)/3 * 1000) / 1000
    let largeItemWidth = collectionView.bounds.width - 10

    if indexPath.item == 6
        return CGSizeMake(largeItemWidth, 100)
    else
        return CGSizeMake(smallItemWidth, 100)
    

*使用 floor() 舍入大小数

【讨论】:

您能告诉我为什么相同的计算不适用于所有边的边插图 10 吗? if indexPath.item == 6 return CGSizeMake(collectionView.bounds.width - 20,height/4) else return CGSizeMake((collectionView.bounds.width - 40)/3, height/4) @ichanduu 这是因为在除法时如果小数太大,最后一个小数会四舍五入,这使得项目大于它们可以放在一行中,请参阅我编辑的解决方案。 @ichanduu 根据您的插图调整数字

以上是关于UIcollectionView 间距的主要内容,如果未能解决你的问题,请参考以下文章

UIcollectionView 间距

UICollectionView 间距边距

UICollectionView:在标题和项目之间添加间距

UICollectionView-如何删除第一个单元格上方的间距?

Swift - UICollectionView 间距问题

iOS - 设置为 0 时 UICollectionView 间距仍然存在 - 如何设置单元格之间没有间距