117

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

将视图的数据源设置为 self 非常容易:

我的视图控制器.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>
4

4 回答 4

286

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

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

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

于 2012-10-17T00:38:56.537 回答
15

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

@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
于 2016-04-06T13:06:28.040 回答
1

macOS Mojave我的两分钱- Swift

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

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

注意:如果你写:

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

方法:

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

被调用。

如果删除,则不会调用委托方法。(因为班级不遵守协议)。

于 2019-07-29T10:21:49.940 回答
0

如果您想快速使用它,只需使用它

控制器委托中的 UICollectionViewDelegateFlowLayout 或为此扩展控制器,然后添加此

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.size.width - 10) / 2, height: (collectionView.frame.size.宽度 - 10) / 2) }

于 2021-12-15T07:23:49.620 回答