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

108

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>
Рич Аподака
источник

Ответы:

265

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

Признаюсь, сначала это застало меня врасплох.

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

Джон Эстропиа
источник
1
@JohnEstropia, извините за вопрос, но как инициализировать собственный макет в коде? Я вижу примеры с раскадровками, но не с самим кодом. Что я должен делать?
gaussblurinc
3
вероятно, self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Дайси Nakajima
14

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

@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
WINСергей
источник
1

Мои два цента за macOS Mojave - Swift

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

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

ПРИМЕЧАНИЕ : Если вы напишете:

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

метод:

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

будет называться.

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

Ingconti
источник