如何在Swift中以编程方式更改UICollectionViewCell大小?

Ril*_*Dev 52 ios uicollectionview uicollectionviewcell swift

我有一个UICollectionViewsegmented control数据之间切换.但是如何以编程方式更改UICollectionViewCell大小属性?然后我可以为每种数据类型适当地定制每种样式.

例如,将宽度更改为520点,将高度更改为100.我是iOS开发新手,对CSS有经验:/

我知道如何在Xcode中做(显然),但不知道在swift中更改它的正确方法.非常感谢任何想法或反馈(Y)

在此输入图像描述

Sum*_*roi 97

确保符合您的类的UICollectionViewDelegateFlowLayout(对于swift4)

eg. class MyClass: UICollectionViewDelegateFlowLayout
Run Code Online (Sandbox Code Playgroud)

在Swift 3之前

//Use for size
func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    }
//Use for interspacing
    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

    func collectionView(collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
        minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }
Run Code Online (Sandbox Code Playgroud)

//对于swift 3

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}
Run Code Online (Sandbox Code Playgroud)

//对于swift 4

extension MyClass: UICollectionViewDelegateFlowLayout { 
        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            sizeForItemAt indexPath: IndexPath) -> CGSize {

        }

        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }

        func collectionView(_ collectionView: UICollectionView, layout
            collectionViewLayout: UICollectionViewLayout,
                            minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用与上面显示的swift 3相同的代码,但只需确保您的类符合协议UICollectionViewDelegateFlowLayout

  • 有趣的是,Xcode 7.3.1中没有自动完成此方法.但如果你只是复制和粘贴,它的工作原理...... (6认同)
  • 十分感谢 !我已经完成它并且它工作得很好,我只是声明`var size = CGSize(width:300,height:100)`并返回size属性.不确定如何添加边界半径思想,将调查.当然,这不是一个长期解决方案,需要使宽度适合每个设备. (3认同)

JPe*_*ric 61

斯威夫特3

如果您使用的是Swift 3,则不会调用来自@ sumit-oberoi的方法.为了使其正常工作,请进行以下调整:

  1. 符合UICollectionViewDelegateFlowLayout协议.

  2. 实现这些方法:

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
    
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
    Run Code Online (Sandbox Code Playgroud)

注意这些变化:

  1. 在方法名称_之前添加collectionView
  2. NSIndexPath 改变为 IndexPath

  • 所以这就是你节省我的时间.. +1投票..**UICollectionViewDelegateFlowLayout** (5认同)

Gau*_*ami 35

斯威夫特3

override func viewDidLoad() {
    super.viewDidLoad()

    let cellSize = CGSize(width:80 , height:80)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)


小智 7

  1. 在 Storyboard 中选择 Collection View 并在 Size Inspector 中将Estimate Size属性设置为NONE,如下所示:

这

  1. 在视图控制器中添加视图控制器的 UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let itemsPerRow:CGFloat = 2
    let padding:CGFloat = 20
    let itemWidth = (collectionView.bounds.width / itemsPerRow) - padding:CGFloat
    let itemHeight = collectionView.bounds.height - (2 * padding:CGFloat)
    return CGSize(width: itemWidth, height: itemHeight)
}
Run Code Online (Sandbox Code Playgroud)


Heo*_*des 6

如果你使用Gaurav Rami的代码

let cellSize = CGSize(width:80 , height:80)

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //.horizontal
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumLineSpacing = 1.0
layout.minimumInteritemSpacing = 1.0
myCollectionView.setCollectionViewLayout(layout, animated: true)
Run Code Online (Sandbox Code Playgroud)

并获取此消息" 快照未呈现的视图会导致空白快照.确保您的视图在屏幕更新后的快照或快照之前至少呈现过一次. "您应该在为集合视图设置视图布局时删除动画

myCollectionView.setCollectionViewLayout(layout, animated: false)
Run Code Online (Sandbox Code Playgroud)

然后消息将消失