Как установить 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
будет вызван.
При удалении метод делегата вызываться не будет. (так как класс не подчиняется протоколу).