Как установить UICollectionViewDelegateFlowLayout?

UIViewController поддерживает ссылку на UICollectionView. Контроллер должен изменить встроенный макет потока, используя UICollectionViewDelegateFlowLayout.

Очень легко настроить источник данных представления на себя:

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>

Ответ 1

Просто self.collectionView.delegate = self;. Обратите внимание, что UICollectionViewDelegateFlowLayout наследуется от UICollectionViewDelegate.

Я признаю, что он может сначала поймать вас на страже.

О, и это будет работать только в том случае, если self.collectionView.collectionViewLayout фактически настроен на ваш макет потока. (или установить с помощью initWithFrame:collectionViewLayout:)

Ответ 2

В соответствии с предыдущим ответом просто пример использования. Это действительно непонятно, но я могу показать, как это работает:

@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

мои два цента за OSX Mojave - Swift

(Я попал сюда в поисках NSCollectionView... Я знаю, что вопрос был о UICollectionView..)

Все сказанное выше (указание делегата также подразумевает размер ячейки) также подходит для OSX.

НОТА если вы напишите:

Класс MyViewController:   NSCollectionViewDelegate,   NSCollectionViewDataSource,    NSCollectionViewDelegateFlowLayout {

метод:

func collectionView (_ collectionView: NSCollectionView,                     макет collectionViewLayout: NSCollectionViewLayout,              sizeForItemAt indexPath: IndexPath) → NSSize

будет вызван.

При удалении метод делегата вызываться не будет. (так как класс не подчиняется протоколу).