Подтвердить что ты не робот

CollectionView sizeForItemAtIndexPath никогда не вызывал

Это сводит меня с ума! У меня есть UICollectionViewController, как показано ниже:

class PhrasesCompactCollectionViewController: UICollectionViewController

Вызывается номерOfSections и cellForItemAt, но sizeForItemAtIndexPath не вызывается. Я использую один и тот же код в другом месте, и он срабатывает правильно. Я использую Xcode 8 Beta 6.

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

        return CGSize(width: 120, height:120) 
    }
4b9b3361

Ответ 1

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

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

Ответ 2

В Swift 3+ используйте этот метод:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

Убедитесь, что ваш класс соответствует как делегат

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout

Ответ 3

Swift 3

Чтобы установить размер ячейки UICollectionView, вам нужно создать и настроить объект UICollectionViewFlowLayout. Настройте свойства и установите этот объект макета в объект UICollectionView.

Измените объекты cellheight и cell cellWidth в соответствии с вашим требованием (высота и ширина ячейки вы хотите).

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

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

Обязательно: если вы добавили метод indexPath sizeForItemAt, тогда необходимо УДАЛИТЬ метод...

Удалить ниже метод

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

}

Ответ 4

Первому классу нужно подтвердить UICollectionViewDelegateFlowLayout. Затем вам нужно написать следующий код в viewDidLoad():

//Чтобы указать UICollectionView использовать ваши UIViewController методы UICollectionViewDelegateFlowLayout

collectionView.delegate = self

//Если вы хотите установить собственный макет потока представления коллекции

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

С помощью этого кода UICollectionViewDelegateFlowLayout метод

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

будет вызван, вы можете установить размер в этом методе.

Ответ 5

У меня была эта проблема прошлой ночью. Наконец, решил в полночь, когда понял, что метод didSelectItemAtIndex не был закрыт с помощью закрывающей скобки "}"

Я добавил закрывающую скобку в самом низу класса, когда его спросила ошибка компиляции. Таким образом, в действительности все методы, приведенные ниже 'didSelectItemAtIndex', были внутри этого метода.

Публикация здесь на всякий случай, если кто-то потратит на это 4 часа своих вечеров :-(

Ответ 6

Убедитесь, что вы поместили это в viewDidLoad()

collectionView.delegate = self

Ответ 7

У меня была такая же проблема, и ничто не решило бы ее. У меня было жёлтое предупреждение о том, что оно должно быть приватным, потому что оно близко к другой функции, определенной делегатом макета. Для меня это было исправлено:

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

Обратите внимание на разницу между "sizeForItemAtIndexPath" и правильным "sizeForItemAt".

Я вырывал свои волосы в течение нескольких дней, пытаясь понять это, и в конце концов это сработало. Ниже я включу все свои функции, чтобы показать вам, как я "спрятал" ячейку, установив высоту равной 0.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width

    if (findIndex! % 2 == 0){
        // Even index, show cell
        return CGSize(width: screenWidth, height: 246)
    }
    else {
        return CGSize(width: screenWidth, height: 0)
    }
}

Ответ 8

У меня такая же проблема. Единственное, что мне помогло, это сделать "Расчетный размер" для размера ячейки в инспекторе размера collectionView "Нет".

enter image description here

Ответ 9

Для меня (в Swift 3.1) метод должен быть объявлен публичным следующим образом:

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

Не забудьте сделать его общедоступным.