UIViewControllerは、UICollectionViewへの参照を維持します。コントローラーは、UICollectionViewDelegateFlowLayoutを使用して組み込みのフローレイアウトを変更する必要があります。
ビューのデータソースをselfに設定するのは非常に簡単です。
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>
ただself.collectionView.delegate = self;
。 UICollectionViewDelegateFlowLayout
はUICollectionViewDelegate
から継承することに注意してください。
最初は不意を突かれるかもしれません。
ああ、これはself.collectionView.collectionViewLayout
が実際にフローレイアウトに設定されている場合にのみ機能します。 (またはinitWithFrame:collectionViewLayout:
で設定)
前の回答によると、単なる使用例です。それは本当に明確ではありませんが、どのように機能するかを示すことができます:
@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
OSX mojave-Swiftの2セント
(NSCollectionViewを検索してここに落ちました...私は質問がUICollectionViewについてだったことを知っています。)
上記のすべて(デリゲートの指定はセルサイズも意味します)もOSXに適しています。
NOTEあなたが書く場合:
クラスMyViewController:NSCollectionViewDelegate、NSCollectionViewDataSource、NSCollectionViewDelegateFlowLayout {
メソッド:
func collectionView(_ collectionView:NSCollectionView、layout collectionViewLayout:NSCollectionViewLayout、sizeForItemAt indexPath:IndexPath)-> NSSize
willが呼び出されます。
削除された場合、デリゲートメソッドは呼び出されません。 (クラスはプロトコルに従わないため)。