2012-11-27 2 views
7

Ich implementiere eine uicollection-Ansicht mit horizontaler Bildlaufrichtung. Ich habe auch die Paging-Option im Storyboard aktiviert. Aus meiner Sicht kann ich 4 Artikel gleichzeitig anzeigen. Wenn ich 5 Gegenstände habe, hat die erste Seite 4 Gegenstände, aber die zweite Seite hat 3 Gegenstände. Vorherige Einträge werden auch auf der zweiten Seite angezeigt.UICollectionView Horizontal Scrolling zeigt vorherige Elemente auch bei aktiviertem Paging an

Ich frage nur, wie kann ich das verhindern? Ich möchte 4 Artikel auf der ersten Seite und nur 1 Artikel auf der zweiten Seite. Ich denke über das Hinzufügen von Elementen nach und setze sie dazu, um dies zu tun. Ist das der richtige Weg, um das zu lösen?

Vielen Dank!

+0

Konnten Sie dieses Problem lösen? Ich habe das gleiche Problem. Ich habe insgesamt 4 Artikel und jede Seite sollte drei Artikel enthalten. Die erste Seite wird korrekt erstellt, aber die Breite der zweiten Seite ist offensichtlich nur so breit wie die des vierten Elements, so scheint es nie auf die zweite Seite zu blättern ... die zweite "Seite" enthält die 2., 3. und 4. Elemente und es schnappt zurück. Stattdessen hätte ich erwartet, dass es auf der zweiten Seite nur einen Eintrag gibt. Jede Hilfe wird geschätzt! –

Antwort

0

Vielleicht könnten Sie die contentSize Eigenschaft der UICollectionView auf das nächste Vielfache seiner bounds setzen?

z.B. für eine Sammlung Ansicht Einzelschnitt:

NSUInteger itemsPerPage = 4; 
NSUInteger pageCount = (NSUInteger) ceilf((float)[collectionView.dataSource numberOfItemsInSection:0]/itemsPerPage); 
CGFloat contentWidth = collectionView.bounds.size.width * pageCount; 
collectionView.contentSize = CGSizeMake(contentWidth, collectionView.contentSize.height); 
+0

An welchem ​​Punkt sollte dies getan werden? Ich habe es in ViewWillAppear und ViewDidAppear versucht und es hat nicht funktioniert. Ich frage mich nur, ob es dafür einen guten Platz gab. –

0

traf ich ein ähnliches Problem, und ich löste es in eine eher hackish-Gefühl Art und Weise, aber es funktioniert, und ich bin zufrieden mit ihm für den Moment.

Im Grunde habe ich beschlossen, die Seiten der Sammlungsansicht mit leeren UICollectionViewCells zu füllen.

Ich zuerst berechnen, wie viele Artikel insgesamt werden. Wenn die Gesamtzahl der von meinem NSFetchedResultsController bereitgestellten Elemente kein genaues Vielfaches von drei ist, füge ich die erforderliche Anzahl von Elementen hinzu, sodass die Gesamtzahl ein Vielfaches von drei ist.

Zum Beispiel, wenn ich vier Kategorien zurück zu bekommen, werde ich brauche zwei weitere hinzuzufügen es insgesamt sechs zu machen:

#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; 
} 

Dann, wenn es Zeit, um die Zellen zu generieren kommt, kann ich das folgende:

- (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; 
    } 

ich hoffe, das jemand in der Zukunft hilft, da die Lösung dieses Problems nicht so einfach war, wie es hätte sein sollen, und ich war überrascht, dass der Fluss Layout entsprechend nicht berechnen nur die Seiten automatisch.

Verwandte Themen