ios swift uicollectionview tableview

ios - Establecer el tamaño de collectionView.(La función sizeForItemAtIndexPath no funciona) Swift 3



uicollectionview tableview (5)

¡He tenido el mismo problema! Si hace el tamaño de la mitad del ancho (ancho / 2), seguirá apareciendo como todo el ancho porque el relleno se agrega al ancho / 2.

Solución: asegúrese de configurar las inserciones de sección en Storyboard a 0. Alternativamente, ajuste el ancho / 2 a un tamaño que INCLUYA las inserciones de sección.

Me tomó un tiempo arreglarlo ;-)

Tengo un tableView y en cada tableViewCell hay un collectionView .

Estoy tratando de cambiar el tamaño de collectionView con este código:

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

El problema es que no hay error pero las celdas no cambian de tamaño

Si necesitas saber algo más, simplemente escribe un comentario.

Gracias.


Así que este es mi código en este momento y funciona:

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


Debe especificar que implementa el protocolo UICollectionViewDelegateFlowLayout en su declaración de clase.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


La firma para este método ha cambiado en Swift 3 a:

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

Preste atención a la sutil diferencia: (_ collectionView: ... lugar de (collectionView: ...

Esto se debe a que en Swift 3, debe especificar explícitamente la etiqueta del primer parámetro. Puede anular este comportamiento predeterminado agregando el carácter de subrayado _ .

Además, asegúrese de que su clase adopte los protocolos UICollectionViewDelegate y UICollectionViewDelegateFlowLayout

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

Consulte este enlace para obtener más información sobre los cambios en Swift 3.


Versión Corta :

Intenta agregar

collectionView.delegate = dataSource

Versión más larga :

Para mí esto fue un pequeño error.

collectionView.dataSource = self

Esto llamaría a estos métodos

func numberOfSections(in collectionView: UICollectionView) -> Int func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

Sin embargo NO llamaría

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

Porque esto no es parte de la fuente de datos de UICollectionView. Es parte del delegado de UICollectionView.

Así que añadiendo lo siguiente resolví mi problema.

collectionView.delegate = dataSource