Это сводит меня с ума! У меня есть UICollectionViewController, как показано ниже:
class PhrasesCompactCollectionViewController: UICollectionViewController
Вызываются numberOfSections и cellForItemAt, но sizeForItemAtIndexPath никогда не вызывается. Я использую точно такой же код в другом месте, и он работает правильно. Я использую Xcode 8 Beta 6.
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 120, height:120)
}
В Swift 3+ используйте этот метод:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width:(collectionView.frame.height-90)/2, height: 100) }
Убедитесь, что ваш класс соответствует требованиям Delegate
UICollectionViewDelegate
UICollectionViewDelegateFlowLayout
источник
UICollectionViewDelegate
как это уже делает UICollectionViewController.У меня такая же проблема. Единственное, что мне помогло, - это установить «Расчетный размер» для размера ячейки в инспекторе размера коллекции «Нет».
источник
sizeForItemAt
не упоминали об этом. Очень полезно.sizeForItemAt
работала хорошо до Xcode 11.4, когда внезапно ячейки оказались неправильной ширины. Пробовал кучу вещей, и это, наконец, сработало.Swift 5
Все эти шаги обязательны :
UICollectionViewDelegate, UICollectionViewDataSource
collectionView.delegate = self
иcollectionView.dataSource = self
в качестве :
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: 100, height:100) }
источник
Swift 3
Чтобы установить размер ячейки UICollectionView, вам необходимо создать и настроить объект
UICollectionViewFlowLayout
. Настройте свойства и установите этот объект макета в объект UICollectionView.Измените ячейки cellheight и 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() }
Убедитесь, что если вы добавили метод sizeForItemAt indexPath, тогда необходимо УДАЛИТЬ метод ...
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
источник
Первому классу необходимо подтвердить UICollectionViewDelegateFlowLayout. Затем вам нужно написать следующий код в viewDidLoad ():
// Чтобы указать UICollectionView использовать методы UICollectionViewDelegateFlowLayout вашего UIViewController
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
будет вызван, вы можете установить размер в этом методе.
источник
Если нет ответа, вам нужно проверить три вещи:
Реализуйте FlowLayout Delegate:
class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Используйте метод размера элемента для Swift 3.0+:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }
Выберите
Estimate size = None
в Inspect элемент UICollectionView.источник
У меня была такая же проблема, и ничто не могло ее исправить. У меня было желтое предупреждение о том, что нужно сделать его закрытым, потому что оно близко к другой функции, определенной делегатом макета. Для меня это было исправлено:
Обратите внимание на разницу между 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) } }
источник
Убедитесь, что вы поместили это в viewDidLoad ()
collectionView.delegate = self
источник
У меня была эта проблема вчера вечером. В конце концов решил это в полночь, когда я понял, что метод didSelectItemAtIndex не был закрыт закрывающей скобкой "}"
Я добавил закрывающую скобку в самом низу класса, когда ее спросила ошибка компиляции. Таким образом, все методы, указанные ниже, «didSelectItemAtIndex» были внутри этого метода.
Публикация здесь на случай, если кто-то еще потратит на это 4 часа своих вечеров :-(
источник
Моя проблема заключалась в том, что у меня был объект UICollectionViewDataSource, созданный как локальная переменная. Поэтому, если вы инициализируете свой объект dataSource вручную в коде, обязательно сохраните его как глобальную переменную.
источник
Используйте этот метод
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { }
Вместо того
private func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { }
источник
Просто добавьте: UICollectionViewDelegateFlowLayout
class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}
источник
Для меня (в Swift 3.1) метод должен быть объявлен публичным следующим образом:
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize() }
Не забудьте сделать это общедоступным .
источник
public
это то, что вы используете, чтобы сделать свой код доступным между фреймворками и модулями.