How to set UICollectionViewDelegateFlowLayout?
-
07-07-2021 - |
题
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>
解决方案
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:
)
其他提示
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
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).