如何设置 UICollectionViewgenerateFlowLayout?

UIViewController 维护对 UICollectionView 的引用。控制器应该使用 UICollectionViewgenerateFlowLayout 修改内置的流布局。

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

MyViewController.m

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

但是如何将控制器设置为视图的委托流布局呢?

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

我试过了:

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

但是我得到了一个错误: “不兼容的指针类型分配...”。

集合头文件如下所示:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
91028 次浏览

只有 self.collectionView.delegate = self;。请注意,UICollectionViewDelegateFlowLayout继承自 UICollectionViewDelegate

我承认一开始让我措手不及。

哦,这将只有当 self.collectionView.collectionViewLayout实际上是设置为您的流布局。(或设置与 initWithFrame:collectionViewLayout:)

根据前面的答案,只是一个使用的例子。它确实不清楚,但我可以展示它是如何工作的:

@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

我对 MacOS Mojave-Swift的看法是

(我一直在这里寻找 NSCollectionView... 我知道问题是关于 UICollectionView. .)

上面所说的(指定委托也意味着单元格大小)对于 macOS 也是正确的。

注意 : 如果你写:

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

方法:

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

将被称为。

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

if you want to use this in swift 用这个

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