How to set UICollectionViewDelegateFlowLayout?

IosUicollectionviewFlowlayout

Ios Problem Overview


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>

Ios Solutions


Solution 1 - Ios

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

Solution 2 - Ios

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

Solution 3 - Ios

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

Solution 4 - Ios

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRich ApodacaView Question on Stackoverflow
Solution 1 - IosJohn EstropiaView Answer on Stackoverflow
Solution 2 - IosWINSergeyView Answer on Stackoverflow
Solution 3 - IosingcontiView Answer on Stackoverflow
Solution 4 - IoskeshavView Answer on Stackoverflow