Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对齐集合视图单元格,使其恰好适合每行3个_Ios_Swift_Xcode_Uicollectionview - Fatal编程技术网

Ios 对齐集合视图单元格,使其恰好适合每行3个

Ios 对齐集合视图单元格,使其恰好适合每行3个,ios,swift,xcode,uicollectionview,Ios,Swift,Xcode,Uicollectionview,我试图创建一个图像集合视图,这样每行有3个,中间没有间隔 “我的收藏”视图数据源包括: func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return pos

我试图创建一个图像集合视图,这样每行有3个,中间没有间隔

“我的收藏”视图数据源包括:

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

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return posts.count
}
这就是我在故事板中的设置方式(imageView宽度为125,是375屏幕宽度的三分之一):

但是,当我运行应用程序并添加一些照片时,它看起来是这样的:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let yourWidth = collectionView.bounds.width/3.0
    let yourHeight = yourWidth

    return CGSize(width: yourWidth, height: yourHeight)
}


如何修复此问题,以便每行可以看到3个图像?谢谢你的帮助

您必须实现

UICollectionViewDelegateFlowLayout

对于间隔的东西

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "UpperCollectionViewCell", for: indexPath) as! UpperCollectionViewCell
    return cell
}

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

    return CGSize(width: (self.collectionView.frame.width/3.0) - 5 , height: (self.collectionView.frame.height/4.0))
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return  2
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return  2
}
设置collectionViewCells的大小,如下所示:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let yourWidth = collectionView.bounds.width/3.0
    let yourHeight = yourWidth

    return CGSize(width: yourWidth, height: yourHeight)
}
您还可以添加以下函数以获得正确的collectionViewCells间距:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets.zero
}

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
}

1-您必须遵守

2-您应该实现方法,如下所示:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let screenWidth = UIScreen.main.bounds.width
    let scaleFactor = (screenWidth / 3) - 6

    return CGSize(width: scaleFactor, height: scaleFactor)
}
假设最小空间为8-例如-

每行的输出应为三项,正方形大小

备注:如果要将单元格之间的空格设置为零,则
scaleFactor
应为:

let scaleFactor = (screenWidth / 3)

希望这有帮助。

您必须实施

UICollectionViewDelegateFlowLayout 对于间隔的东西

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "UpperCollectionViewCell", for: indexPath) as! UpperCollectionViewCell
    return cell
}

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

    return CGSize(width: (self.collectionView.frame.width/3.0) - 5 , height: (self.collectionView.frame.height/4.0))
}

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

Swift-版本4.2

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

    let noOfCellsInRow = 3

    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout

    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))

    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))

    return CGSize(width: size, height: size) 
}
你可以用这个

这段代码是以某种方式编写的,您可以更改截面插入或MinimuminemSpacing,并使用此参数计算和调整大小

您可以使用此代码或从下载项目

func collectionView(collectionView:UICollectionView,布局collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:indexPath)->CGSize{
让flowLayout=collectionViewLayout为!UICollectionViewFlowLayout
让numberofItem:CGFloat=3
让collectionViewWidth=self.collectionView.bounds.width
让外部空间=(numberofItem-1)*flowLayout.minimumInteritemSpacing
让插图=flowLayout.sectionInset.right+flowLayout.sectionInset.left
let width=Int((collectionViewWidth-extraSpace-inset)/numberofItem)
打印(宽度)
返回CGSize(宽度:宽度,高度:宽度)
}

您真的需要此处的收藏视图吗?只需在代码中创建您描述的图像视图网格是非常容易的。如果你不需要任何其他的集合视图功能,为什么要为这么基本的东西设置集合视图呢?我想这是另一种方式,我会在另一个项目中记住它。这个问题现在已经解决了,所以我还是把它作为一个集合视图来保存吧——使用您的方法会有什么好处吗,或者只是一开始就更容易实现吗?唯一的“好处”是您显然不知道如何创建具有所需结构的集合视图。如果问题解决了,一定要坚持下去!