How to set UICollectionViewDelegateFlowLayout?
Asked Answered
M

4

123

A UIViewController maintains a reference to a UICollectionView. The controller should modify the built-in flow layout using the UICollectionViewDelegateFlowLayout.

It's pretty easy to set the view's data source to self:

MyViewController.m

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

But how do I set the controller to be the delegate flow layout of the view?

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

I've tried:

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

But I get the error: "Incompatible pointer types assigning ...".

The collection header file looks like this:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Maldives answered 17/10, 2012 at 0:8 Comment(0)
E
294

Just self.collectionView.delegate = self;. Note that UICollectionViewDelegateFlowLayout inherits from UICollectionViewDelegate.

I admit it caught me off guard at first.

Oh and this will only work if self.collectionView.collectionViewLayout is actually set to your flow layout. (or set with initWithFrame:collectionViewLayout:)

Etherege answered 17/10, 2012 at 0:38 Comment(2)
@JohnEstropia, sorry for question, but how to init custom layout in code? I see examples with storyboards but not with code itself. What should I do?Mowbray
probably, self.collectionViewLayout = UICollectionViewFlowLayout(), self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]Faletti
S
15

According to previous answer just example of use. It really not clear but I can show how it works:

@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
Sidwel answered 6/4, 2016 at 13:6 Comment(0)
A
1

My two cents for macOS Mojave - Swift

(I've fallen here searching for NSCollectionView... I do know question was about UICollectionView..)

All said above (specifying delegate implies cell size, too) is correct for macOS, too.

NOTE: If You write:

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

the method:

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

will be called.

If removed, no delegate method will be called. (as class does not obey to the protocol).

Abbreviation answered 29/7, 2019 at 10:21 Comment(0)
R
0

if you want to use this in swift just use this

UICollectionViewDelegateFlowLayout in your controller delegate or make an extension of your controller for this after that add this

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return  CGSize(width: (collectionView.frame.size.width - 10) / 2, height: (collectionView.frame.size.width - 10) / 2)
}
Roseanneroseate answered 15/12, 2021 at 7:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.