ios 设置集合视图大小,(sizeForItemAtIndexPath函数不工作)Swift 3

tzxcd3kk  于 2023-05-08  发布在  iOS
关注(0)|答案(7)|浏览(249)

我有一个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)
    }

}

问题是没有错误,但单元格不改变大小
如果你想知道更多,请写评论。
谢谢大家。

e7arh2l6

e7arh2l61#

首先,不要忘记扩展自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)
}

故事板中的重要一点不要忘记估计大小:无

myzjeezk

myzjeezk2#

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

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

注意细微的区别:(_ 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
    }
}

请参阅this link以了解有关Swift 3中更改的更多信息。

bxpogfeg

bxpogfeg3#

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

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
odopli94

odopli944#

这是我现在的代码,它可以工作:

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")
        }
qmelpv7a

qmelpv7a5#

简体字

试试加

collectionView.delegate = dataSource

较长版本

对我来说,这是一个小小的错误--

collectionView.dataSource = self

这将调用这些方法

func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

但它不会***调用

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

因为这不是UICollectionView的dataSource的一部分。它是UICollectionView委托的一部分。
添加以下内容解决了我的问题。

collectionView.delegate = dataSource
vddsk6oq

vddsk6oq6#

我也有同样的问题!如果您使大小为宽度的一半(宽度/2),那么它仍然会显示为整个宽度,因为填充被添加到宽度/2。
修复:确保将情节提要中的节插入设置为0。或者,将宽度/2调整为包含剖面插图的大小。
我花了点时间才修好那个- )

vh0rcniy

vh0rcniy7#

不要忘记将UICollectionViewFlowLayout对象分配给您的collectionViewLayout,因为UICollectionView默认使用的是UICollectionViewLayout,而不是UICollectionViewFlowLayout。
let flowLayout = UICollectionViewFlowLayout()
collectionView.collectionViewLayout = flowLayout

相关问题