¿Cómo configurar UICollectionViewDelegateFlowLayout?

108

Un UIViewController mantiene una referencia a un UICollectionView. El controlador debe modificar el diseño de flujo integrado mediante UICollectionViewDelegateFlowLayout.

Es bastante fácil configurar la fuente de datos de la vista en sí misma:

MyViewController.m

- (void)viewDidLoad
{
    self.collectionView.dataSource = self;
}

Pero, ¿cómo configuro el controlador para que sea el diseño de flujo delegado de la vista?

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    // self.collectionView.??? = self; 
}

He intentado:

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    self.collectionView.collectionViewLayout = self; 
}

Pero aparece el error: "Tipos de puntero incompatibles que asignan ...".

El archivo de encabezado de la colección se ve así:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Rico Apodaca
fuente

Respuestas:

265

Solo self.collectionView.delegate = self;. Tenga en cuenta que UICollectionViewDelegateFlowLayouthereda de UICollectionViewDelegate.

Admito que me tomó con la guardia baja al principio.

Ah, y esto solo funcionará si self.collectionView.collectionViewLayoutestá realmente configurado en su diseño de flujo. (o establecer con initWithFrame:collectionViewLayout:)

John Estropia
fuente
1
@JohnEstropia, perdón por la pregunta, pero ¿cómo iniciar el diseño personalizado en el código? Veo ejemplos con guiones gráficos pero no con el código en sí. ¿Qué tengo que hacer?
gaussblurinc
3
Probablemente, self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi Nakajima
14

Según respuesta anterior solo ejemplo de uso. Realmente no está claro, pero puedo mostrar cómo funciona:

@interface PrettyViewController()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
    //some code
@end

@implementation PrettyViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.collectionView.delegate = self;//bingo! right here
}

#pragma mark - UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake([[UIScreen mainScreen] bounds].size.width, 20.0);
}


@end
WINSergey
fuente
1

Mis dos centavos por macOS Mojave - Swift

(Me he caído aquí buscando NSCollectionView... sé que la pregunta era sobre UICollectionView...)

Todo lo dicho anteriormente (especificar delegado también implica el tamaño de celda) también es correcto para macOS.

NOTA : Si escribe:

class MyViewController:
    NSCollectionViewDelegate,
    NSCollectionViewDataSource,
    **NSCollectionViewDelegateFlowLayout** 
{

el método:

func collectionView(_ collectionView: NSCollectionView, 
                      layout collectionViewLayout: NSCollectionViewLayout, 
               sizeForItemAt indexPath: IndexPath) -> NSSize

será llamado.

Si se elimina, no se llamará a ningún método delegado. (ya que la clase no obedece al protocolo).

ingconti
fuente