Установите размер коллекции. (функция sizeForItemAtIndexPath не работает) Swift 3

У меня есть 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)
    }

}

Проблема в том, что ошибки нет, но ячейки не меняют размеры

Если вам нужно что-то узнать, просто напишите комментарий.

Спасибо.

Ответы

Ответ 1

Итак, это мой код прямо сейчас, и он работает:

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

Ответ 2

Подпись для этого метода изменилась в Swift 3 до:

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

Обратите внимание на тонкую разницу: (_ collectionView: ... вместо (collectionView: ....

Это связано с тем, что в Swift 3 вы должны явно указать метку первого параметра. Вы можете переопределить это поведение по умолчанию, добавив символ подчеркивания _.

Кроме того, убедитесь, что ваш класс использует протоколы UICollectionViewDelegate и UICollectionViewDelegateFlowLayout

class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {

    // your code here

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

Обратитесь к этой ссылке, чтобы узнать больше об изменениях в Swift 3.

Ответ 3

Вам нужно указать, что вы реализуете протокол UICollectionViewDelegateFlowLayout в своем объявлении класса.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

Ответ 4

Краткая версия:

Попробуйте добавить

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

Ответ 5

У меня была такая же проблема! Если вы сделаете размер половиной ширины (ширина/2), то он по-прежнему будет выглядеть как вся ширина, потому что добавление добавляется к ширине /2.

Исправлено: Убедитесь, что вставки разделов в Storyboard равны 0. В качестве альтернативы отрегулируйте ширину /2 до размера, ВКЛЮЧАЯ вставки раздела.

Мне понадобилось некоторое время, чтобы исправить это: -)