¿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>

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


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.