I napotkał podobny problem, i rozwiązać go w dość hackish-uczucie sposób, ale działa i jestem zadowolony z niego teraz.
Zasadniczo zdecydowałem, aby umieścić strony widoku kolekcji z pustymi komórkami UICollectionViewCell.
Najpierw obliczyłem, ile będzie wszystkich elementów. Jeśli całkowita liczba elementów dostarczonych przez mój NSFetchedResultsController nie jest dokładną wielokrotnością trzech, to dodaję wymaganą liczbę elementów, aby całkowita była wielokrotnością trzech.
Na przykład, jeśli mam cztery kategorie powrotem, będę musiał dodać dwa więcej, aby uczynić to w sumie sześć:
#define ITEMS_PER_PAGE 3
//...
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
NSArray *sections = [categoriesFetchedResultsController sections];
id <NSFetchedResultsSectionInfo> sectionInfo = sections[section];
NSInteger categoryCount = [sectionInfo numberOfObjects];
NSInteger extraItemsNeeded = ITEMS_PER_PAGE - (categoryCount % ITEMS_PER_PAGE);
NSInteger totalItems = categoryCount + extraItemsNeeded;
NSInteger pages = (NSInteger)(totalItems/ITEMS_PER_PAGE);
self.pageControl.numberOfPages = pages;
return totalItems;
}
Potem, gdy przychodzi czas generowania komórek, I wykonaj następujące:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryCell" forIndexPath:indexPath];
// use a generic UICollectionCell for the "empty cell" case.
UICollectionViewCell *emptyCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"EmptyCell" forIndexPath:indexPath];
if (indexPath.row < [[categoriesFetchedResultsController fetchedObjects] count]) {
NSManagedObject *object = [categoriesFetchedResultsController objectAtIndexPath:indexPath];
NSData *imageData = [object valueForKey:@"thumbnail_data"];
NSString *name = [object valueForKey:@"category_name"];
cell.image.image = [UIImage imageWithData:imageData];
cell.label.text = name;
return cell;
}
return emptyCell;
}
mam nadzieję, że ktoś pomoże w przyszłości, ponieważ rozwiązanie tego problemu nie było tak proste, jak powinno być, i byłem zaskoczony, że układ przepływu nie tylko automatycznie obliczy stron odpowiednio.
Czy byłeś w stanie rozwiązać ten problem? Wydaje mi się, że mam ten sam problem. Mam 4 przedmioty łącznie, a każda strona powinna zawierać po trzy pozycje. Pierwsza strona zostanie poprawnie utworzona, ale szerokość drugiej strony jest oczywiście tylko tak szeroka, jak czwarty element, więc nigdy nie wydaje się, aby strona była na drugiej stronie ... druga "strona" zawiera elementy 2, 3 i 4 i odskakuje. Zamiast tego oczekiwałby, że będzie miał tylko jeden element na stronie drugiej. Każda pomoc zostanie doceniona! –