2016-08-23 4 views
35

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

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

ответ

112

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

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout

+2

Спасибо! Это была отличная подпись для Xcode 8 Beta 6. Спасибо! –

+7

этот ответ должен быть принят. –

+0

Отличный ответ, спасибо! – Rados

9

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

Убедитесь, что: если вы добавили метод sizeForItemAt indexPath затем необходимо удалить метод ...

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

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

} 
+3

Как это полезно? – almas

+0

Almas, Это поможет установить собственный размер ячеек UICollectionViewCell ... Существуют переменные cellWidth и cellHeight, в которых вы можете определить свои собственные значения. А также «layout.sectionInset», «layout.minimumLineSpacing» и «layout.minimumInteritemSpacing», эти переменные также имеют значение для размера UICollectionViewCell. –

+0

Пожалуйста, добавьте описание в свой ответ. – Darshana

11

В 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

+1

Это лишнее, чтобы соответствовать 'UICollectionViewDelegate', как уже делает UICollectionViewController. –

+0

@VanDuTran Не лишнее заявить, что это необходимо, потому что не требуется UICollectionViewController ... –

-4

Для меня (в Swift 3.1) метод должен быть объявлен публика такая:

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

Не забудьте сделать это общественного.

Смежные вопросы