UICollectionView를 두 번째로 사용하고 아마도 씹을 수있는 것보다 더 많이 물었을 것입니다.
서브 클래 싱 한 사용자 지정 UICollectionViewCell을 사용하는 UICollectionView (myCollectionView)를 구현하고 있습니다. 서브 클래 싱 된 셀 (FullReceiptCell)은 UITableView를 포함하며 viewcontroller의 크기입니다. FullReceiptCells 사이의 가로 스크롤을 허용하려고합니다.
myCollectionView를 포함하는 서브 클래 싱 된 UICollectionViewController가 nav 컨트롤러 스택으로 푸시됩니다. 현재 myCollectionView loas 및 수평 스크롤이 활성화되어 있습니다. 그러나 셀은 표시되지 않습니다. 나는 확인했다
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
실행되어 0보다 큰 정수를 반환합니다. 또한 myCollectionView의 델리게이트와 데이터 소스가 IB에서 하위 클래스 UICollectionViewController로 올바르게 설정되어 있는지 확인했습니다.
셀이로드되는 방법 :
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
호출되지 않습니다.
다음은 해당 컨트롤러 내에서 UICollectionViewController 및 내 viewDidLoad 메서드를 푸시하는 위치입니다 (참고 : initWithBill은 일반 이니셜 라이저의 재정의입니다).
이전 ViewControllers .m 파일에서 :
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
FullReceiptViewController.m에서 :
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
self.myCollectionView.pagingEnabled = YES;
// Setup flowlayout
self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
[self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
//testing to see if the collection view is loading
self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
왜 호출되지 않는지에 대한 단서가 있습니까?
답변
나중에 여기에서 우연히 발견 한 사람들을 위해 …. 이유 :
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
collectionViewFlowLayout의 높이가 너무 커서 itemSize가 호출되지 않았습니다.
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
높이를 410으로 변경하면 cellForItemAtIndexPath가 실행됩니다.
답변
제 경우에는 레이아웃 클래스 UICollectionViewLayout
가UICollectionViewFlowLayout
답변
컬렉션 뷰에 콘텐츠 크기 정보를 제공하지 않으면 cellForItemAtIndexPath가 호출되지 않습니다.
- 흐름 레이아웃을 사용하는 경우 : 항목 크기를 적절하게 설정해야합니다.
- UICollectionViewLayout에서 서브 클래 싱 된 사용자 지정 레이아웃이있는 경우 : collectionViewContentSize 메서드에서 적절한 크기를 반환하는지 확인합니다.
후자의 경우에는 layoutAttributesForElementsRect 도 호출되지 않습니다. 그 이유는 콘텐츠 크기를 지정하지 않았으며 기본적으로 크기는 CGSizeZero입니다. 이것은 기본적으로 컬렉션 뷰에 페인트 할 내용이 없음을 알려주므로 속성이나 셀을 요구하지 않습니다.
따라서 collectionViewContentSize를 재정의하고 적절한 크기를 제공하면 문제가 해결됩니다.
답변
어쩌면 나는 그것을 간과하고 있지만 귀하의 대리인과 데이터 소스가 누락 된 것 같습니다. 헤더 파일에서 다음을 추가했는지 확인하십시오.
<UICollectionViewDelegate, UICollectionViewDataSource>
viewDidLoad 메소드에서 다음을 추가하십시오.
self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;
또한 .xib를 통해로드하는 경우 IBOutlet을 UICollectionView에 연결했는지 확인하십시오.
답변
보다 복잡한보기 계층 구조를 보려면이 블로그 를 확인하십시오 . 그것은 내 생명을 구했습니다!
self.automaticallyAdjustsScrollViewInsets = NO;
답변
클래스가 UICollectionviewController의 하위 클래스이고 프로그래밍 방식으로 collectionView를 생성하는 경우
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .Vertical
layout.itemSize = CGSizeMake(50, 50)
collectionView?.setCollectionViewLayout(layout, animated: false)
답변
나는 자동 레이아웃을 사용하고 있었고 내 경우에는 높이 제약이 누락되었습니다.