2013-02-13 5 views
27

Ich mache eine einfache UICollectionView mit einem Paging-Mechanismus aktiviert, und alles funktioniert gut. Wenn Sie jedoch zur letzten Seite blättern, ist die Anzahl der Zellen auf dem Bildschirm nicht vollständig sichtbar, und die letzte Seite enthält einige Zellen der vorherigen Seite. Wie erweitere ich die contentSize der UICollectionView so, dass die letzte Seite keine Zellen der vorherigen Seite enthält?Wie UICollectionView contentSize zu erweitern, wenn Paging aktivieren?

Ein Beispiel here: Die UICollectionView scrollt horizontal mit 6 Zellen, auf diese Weise:

Seite 1: cell0 - cell1 - cell2 - cell3

Scroll: cell2-cell3-Zelle4-cell5 // Nicht zu erwarten: Wie zu ändern: Zelle4 - Zelle 5 in Seite2.

ZUSAMMENFASSUNG:

I

collectionView.contentSize = numberOfPage * collectionView.frame

NICHT

collectionView.contentSize = numberOfCell * (cellFrame + spacing)

+0

Es sollte eigentlich nicht passieren. Können Sie PLZ Code-Snippet wenn überhaupt plz. – Swapnil

+0

Ich versuche: [collectonView setContentSize] in viewDidLoad und viewDidAppear aber es funktioniert nicht, weil contentSize in Datenquelle neu geschrieben wird. –

Antwort

32

Sie müssen UICollectionViewLayout von der Unterklasse trennen und die collectionViewContentSize-Methode überschreiben. Ich unterteilte UICollectionViewFlowLayout, also würde ich den ganzen Layout-Code nicht neu schreiben müssen.

ich ein 4x4-Raster baue, so meine Methode sieht wie folgt aus:

- (CGSize)collectionViewContentSize 
{  
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0]; 
    NSInteger pages = ceil(itemCount/16.0); 

    return CGSizeMake(320 * pages, self.collectionView.frame.size.height); 
} 

Randnotiz, wenn Sie eine benutzerdefinierte Layout verwenden, verlieren Sie die Möglichkeit, die einige der Objekte in der einzustellen Schnittstellenerstellung. Sie können sie programmatisch in der Methode init Ihrer benutzerdefinierten UICollectionViewLayout-Unterklasse festlegen. Hier ist meine Referenz:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self setup]; 
    } 

    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) { 
     [self setup]; 
    } 

    return self; 
} 

- (void)setup 
{ 
    self.itemSize = CGSizeMake(65.0f, 65.0f); 
    self.minimumLineSpacing = 15; 
    self.sectionInset = UIEdgeInsetsMake(7.5f, 7.5f, 30.0f, 7.5f); 
    [self setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
} 
+0

Mir wurde gesagt, dass diese Art von Sache einen riesigen Speicherbedarf verursachen könnte, weil die gesamte Sammlungsansicht "gezeigt" würde und die Wiederverwendbarkeit von Zellen nicht möglich wäre. Ist das wahr? –

+0

UICollectionView ist bereits eine Unterklasse von UIScrollView und contentSize ist natürlich dafür, ich glaube nicht, dass Sie sich Gedanken über die Wiederverwendbarkeit von Zellen machen müssen, weil alle Zellen nie sichtbar sind. –

+0

'collectionView.collectionViewLayout.collectionViewContentSize()' ist was Sie brauchen. Wenn es nicht gültig ist, einfach "collectionView.layoutIfNeeded()", bevor Sie contentSize erhalten. –

0

Sie können den Inhalt anpassen mit dem viewDidLayoutSubviews: m festlegen möchten ethod. Diese Methode wird aufgerufen, wenn die Sammlungsansicht und alle Zellen in view platziert werden, sodass Sie die Zelle anpassen können.

+0

Es funktioniert nicht, cellForItemAtIndexPath auch beim Scrollen aufrufen. –

0

Ich denke, Sie müssen UICollectionViewLayout Unterklasse und erstellen Sie Ihr eigenes Layout, um diese Art von Problemen zu verwalten.

2

Für horizontalen Paging

if(CollectionView.pagingEnabled) 
{ 

    int numberOfPages = floor(collectionView.contentSize.width/
         collectionView.frame.size.width) + 1; 
          CGFloat 
    float requierdWidth=self.collectionView.frame.size.width*numberOfPages; 

    self.Layout.footerReferenceSize=CGSizeMake(requierdWidth-self.collectionView.contentSize.width,0); 
} 
1

Die Antwort funktioniert gut, wenn auch für unseren Code, den wir pro Seite einen Abschnitt hatten. So ist es die Überschreibung für unsere Layout-Klasse gemeint war nur

-(CGSize) collectionViewContentSize { 
    return CGSizeMake(CGRectGetWidth(self.collectionView.frame) * 
       [self.collectionView numberOfSections], 
       CGRectGetHeight(self.collectionView.frame)) ; 
} 
0

ich eine Antwort haben, die keine Unterklassen erfordert.

In -viewDidLoad berechnen, wie viele Elemente pro Seite Sie haben und wie viele Seiten Sie haben. Speichern Sie diese Werte in Eigenschaften.

self.numberOfItemsPerPage = NumberOfRows * NumberOfColumns; 
    self.numberOfPages = ceilf((CGFloat)self.items.count/(CGFloat)self.numberOfItemsPerPage); 

Dann in -collectionView: numberOfItemsInSection: liegen nur daran:

return self.numberOfItemsPerPage * self.numberOfPages; 

Sie natürlich haben mehr Zellen als Inhalt, nicht wahr? So in -collectionView: cellForItemAtIndexPath: nur zurückgeben null für die zusätzliche Zellen:

if (indexPath.item > [self.items count] - 1) { 
    //We have no more items, so return nil. This is to trick it to display actual full pages. 
    return nil; 
    } 

Dort gehen Sie: voll, scrollbaren letzte Seite. Meiner Meinung nach sollte der horizontale Scroll-Modus einfach auf diesen Standard eingestellt werden.

+0

Ziemlich sicher, dass eine Zelle nicht nil sein kann :(Ich habe es versucht und diesen Fehler bekommen: '*** Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'die Datenquelle der Sammlungsansicht hat keine gültige Zelle von -collectionView zurückgegeben: cellForItemAtIndexPath: für den Indexpfad ' – taber

Verwandte Themen