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.