Ответ 1
Вам нужно указать, что вы реализуете протокол UICollectionViewDelegateFlowLayout
в своем объявлении класса.
class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Это сводит меня с ума! У меня есть 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)
}
Вам нужно указать, что вы реализуете протокол UICollectionViewDelegateFlowLayout
в своем объявлении класса.
class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
В 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
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 {
}
Первому классу нужно подтвердить 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
будет вызван, вы можете установить размер в этом методе.
У меня была эта проблема прошлой ночью. Наконец, решил в полночь, когда понял, что метод didSelectItemAtIndex не был закрыт с помощью закрывающей скобки "}"
Я добавил закрывающую скобку в самом низу класса, когда его спросила ошибка компиляции. Таким образом, в действительности все методы, приведенные ниже 'didSelectItemAtIndex', были внутри этого метода.
Публикация здесь на всякий случай, если кто-то потратит на это 4 часа своих вечеров :-(
Убедитесь, что вы поместили это в viewDidLoad()
collectionView.delegate = self
У меня была такая же проблема, и ничто не решило бы ее. У меня было жёлтое предупреждение о том, что оно должно быть приватным, потому что оно близко к другой функции, определенной делегатом макета. Для меня это было исправлено:
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)
}
}
У меня такая же проблема. Единственное, что мне помогло, это сделать "Расчетный размер" для размера ячейки в инспекторе размера collectionView "Нет".
Для меня (в Swift 3.1) метод должен быть объявлен публичным следующим образом:
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize()
}
Не забудьте сделать его общедоступным.