如何设置UICollectionViewDelegateFlowLayout?

时间:2012-10-17 00:08:26

标签: ios uicollectionview flowlayout

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

将视图的数据源设置为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>

3 个答案:

答案 0 :(得分:218)

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

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

哦,这只有在self.collectionView.collectionViewLayout实际设置为您的流布局时才有效。 (或设置为initWithFrame:collectionViewLayout:

答案 1 :(得分:11)

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

@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

答案 2 :(得分:1)

我为 OSX莫哈韦沙漠-斯威夫特

(我已经在这里搜索NSCollectionView ...我知道问题是关于UICollectionView的。)

上述所有内容(指定代表也暗示单元格大小)对于OSX也是正确的。

注意 如果您写:

MyViewController类:     NSCollectionViewDelegate,     NSCollectionViewDataSource,      NSCollectionViewDelegateFlowLayout {

方法:

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

将被呼叫。

如果删除,则不会调用任何委托方法。 (因为课堂不遵守协议)。