How to set UICollectionViewDelegateFlowLayout?

帅比萌擦擦* 提交于 2019-11-27 12:36:39

问题


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>

回答1:


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

I admit it can catch you 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:)




回答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



回答3:


my two cents for OSX 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 OSX, 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).



来源:https://stackoverflow.com/questions/12925280/how-to-set-uicollectionviewdelegateflowlayout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!