[ios] UICollectionViewDelegateFlowLayout을 설정하는 방법은 무엇입니까?

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


답변

macOS Mojave를 위한 나의 2 센트 -Swift

(난 여기 검색에 빠졌는데 NSCollectionView… 질문이 UICollectionView..

위에서 말한 모든 것 (대리자 지정은 셀 크기도 의미 함)은 macOS에도 적합합니다.

참고 : 작성하는 경우 :

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

방법:

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

것이다 라고.

제거하면 델리게이트 메서드가 호출되지 않습니다. (클래스가 프로토콜을 따르지 않기 때문에).


답변