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
것이다 라고.
제거하면 델리게이트 메서드가 호출되지 않습니다. (클래스가 프로토콜을 따르지 않기 때문에).