设置collectionView大小.(sizeForItemAtIndexPath函数不起作用)Swift 3

0nd*_*re_ 24 tableview ios uicollectionview swift

我有一个,tableView而且每个tableViewCell都是一个collectionView.

我试图用这段代码更改collectionView大小:

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

    if collectionView.tag == 2{

        return CGSize(width: 100, height: 100)

    }else if collectionView.tag == 4 {


        return CGSize(width: 222, height: 200)

    }else{


        return CGSize(width: 10, height: 10)
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是没有错误,但细胞不会改变大小

如果您需要了解更多信息,请撰写评论.

谢谢.

Ped*_*eno 59

此方法的签名已在Swift 3中更改为:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    // your code here
}
Run Code Online (Sandbox Code Playgroud)

注意细微差别:(_ collectionView: ...而不是(collectionView: ....

这是因为在Swift 3中,您必须明确指定第一个参数的标签.您可以通过添加下划线字符来覆盖此默认行为_.

此外,请确保您的类同时采用UICollectionViewDelegateUICollectionViewDelegateFlowLayout协议

class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {

    // your code here

    func collectionView(_ collectionView: UICollectionView,
                layout collectionViewLayout: UICollectionViewLayout,
                sizeForItemAt indexPath: IndexPath) -> CGSize {
        // your code here
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅此链接以了解有关Swift 3中的更改的更多信息.

  • 在delgate调用中添加"UICollectionViewDelegateFlowLayout" (21认同)
  • 这是正确的答案.非常感谢你做的这些!UICollectionViewDelegateFlowLayout是关键 (4认同)

小智 19

您需要指定在类声明中实现协议UICollectionViewDelegateFlowLayout.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Run Code Online (Sandbox Code Playgroud)


Bur*_*lek 11

首先,不要忘记从UICollectionViewDelegateFlowLayout委托进行扩展。

对于单个collectionview显示逻辑:

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = ((collectionView.frame.width - 15) / 2) // 15 because of paddings
    print("cell width : \(width)")
    return CGSize(width: width, height: 200)
}
Run Code Online (Sandbox Code Playgroud)

情节提要中的重点不要忘记估计大小:无

estimate_size_none

  • 我正在使用 XCode 11.2.1,此版本将“自动”值作为“估计大小”的默认值。所以将其更改为 None 对我有用。谢啦! (3认同)
  • 哇。你救了我的日子。将估算大小从自动更改为无(单元格的最小间距从10更改为0,行的最小间距从10更改为0)后,func collectionView(_ collectionView:UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath)起作用了!在编辑之前,我遇到了意外的像元宽度和像元的最小间距。 (2认同)

0nd*_*re_ 5

所以这是我现在的代码并且它有效:

        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.tag = row
        collectionView.setContentOffset(collectionView.contentOffset, animated:false)
        collectionView.reloadData()
        collectionView.register(UINib(nibName: "eventsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "eventsCollectionViewCell")


        if row == 2{


            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 120, height: 120)
            layout.scrollDirection = .horizontal

            collectionView.collectionViewLayout = layout

        }else if row == 4 {


            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 222, height: 200)
            layout.scrollDirection = .horizontal

            collectionView.collectionViewLayout = layout

        }else{

            print("else")
        }
Run Code Online (Sandbox Code Playgroud)

  • 什么是行?如何以及在何处声明和分配? (5认同)