Jak ustawić UICollectionViewDelegateFlowLayout?

108

UIViewController utrzymuje odwołanie do UICollectionView. Kontroler powinien zmodyfikować wbudowany układ przepływu przy użyciu UICollectionViewDelegateFlowLayout.

Ustawienie źródła danych widoku na siebie jest dość łatwe:

MyViewController.m

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

Ale jak ustawić kontroler jako układ przepływu delegatów widoku?

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

Próbowałem:

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

Ale pojawia się błąd: „Przypisywanie niezgodnych typów wskaźników ...”.

Plik nagłówkowy kolekcji wygląda następująco:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Rich Apodaca
źródło

Odpowiedzi:

265

Po prostu self.collectionView.delegate = self;. Zauważ, że UICollectionViewDelegateFlowLayoutdziedziczy z UICollectionViewDelegate.

Przyznaję, że na początku zaskoczyło mnie to.

Aha, i to zadziała tylko wtedy, gdy self.collectionView.collectionViewLayoutjest faktycznie ustawione na twój układ przepływu. (lub ustaw za pomocą initWithFrame:collectionViewLayout:)

John Estropia
źródło
1
@JohnEstropia, przepraszam za pytanie, ale jak zainicjować niestandardowy układ w kodzie? Widzę przykłady ze scenorysami, ale nie z samym kodem. Co powinienem zrobić?
gaussblurinc
3
Prawdopodobnie self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi Nakajima
14

Zgodnie z poprzednią odpowiedzią tylko przykład użycia. To naprawdę nie jest jasne, ale mogę pokazać, jak to działa:

@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
źródło
1

Moje dwa centy za macOS Mojave - Swift

(Spadłem tutaj, szukając NSCollectionView... Wiem, że pytanie dotyczyło UICollectionView...)

Wszystko powyższe (określenie delegata oznacza również rozmiar komórki) jest poprawne również dla systemu MacOS.

UWAGA : Jeśli napiszesz:

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

metoda:

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

zostanie wezwany.

Jeśli zostanie usunięty, żadna metoda delegata nie zostanie wywołana. (ponieważ klasa nie przestrzega protokołu).

ingconti
źródło