Як встановити 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

1

Мої два центи для macOS Mojave - Swift

(Я потрапив сюди в пошуках NSCollectionView... я знаю, питання стосувалося UICollectionView..)

Все сказане вище (якщо вказати делегат означає, що розмір комірок теж є правильним) також для macOS.

ПРИМІТКА . Якщо ви пишете:

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

спосіб:

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

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

Якщо його видалити, метод делегата не буде викликаний. (оскільки клас не підкоряється протоколу).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.