How to set UICollectionViewDelegateFlowLayout?
Solution 1
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
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
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).
Related videos on Youtube
Rich Apodaca
Software developer and PhD chemist. My company is Metamolecular, maker of ChemWriter™, the 2D chemical structure editor for Web applications.
Updated on July 08, 2022Comments
-
Rich Apodaca almost 2 years
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>
-
gaussblurinc almost 10 years@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?
-
Daishi Nakajima about 8 yearsprobably,
self.collectionViewLayout = UICollectionViewFlowLayout()
,self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
-
keshav over 2 yearsdon't for to give datasoruce and delegate of your collectionView