UICollectionViewDelegateFlowLayoutを設定する方法


108

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>

回答:


265

ただself.collectionView.delegate = self;。はUICollectionViewDelegateFlowLayoutから継承することに注意してくださいUICollectionViewDelegate

最初は不意を突かれたことは認めます。

ああ、これself.collectionView.collectionViewLayoutは実際にフローレイアウトに設定されている場合にのみ機能します。(またはで設定initWithFrame:collectionViewLayout:


1
@JohnEstropia、申し訳ありませんが、カスタムレイアウトをコードで初期化する方法は?ストーリーボードの例は表示されますが、コード自体は表示されません。私は何をすべきか?
gaussblurinc 2014年

3
おそらく、self.collectionViewLayout = UICollectionViewFlowLayout()self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
大師中島

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の 2セント-Swift

(私はここを探して落ちましたNSCollectionView...私は質問がUICollectionView.. についてであったことを知っています。)

上記のすべて(デリゲートを指定するとセルサイズも意味する)は、macOSにも当てはまります。

:あなたが書く場合:

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

メソッド:

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

されますと呼ばれます。

削除した場合、デリゲートメソッドは呼び出されません。(クラスがプロトコルに準拠していないため)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.