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.