2016-07-15 19 views
5

Ich möchte nur zwei Zellen in einer Zeile anzeigen, egal, was die iPhone-Bildschirmgröße ist. Wie, End result requiredAnzeigen nur zwei Spalten mit mehreren Zeilen in einer CollectionView mit Storyboard

Mein Storyboard enthält eine UICollectionView, durch Einschränkungen verbunden.

Storyboard preview

Die Storyboard-Einstellungen für die UICollectionView ist, enter image description here

Nun, wenn ich diese laufen in 6, 5 s oder weniger, erscheint nur eine Zelle in einer Reihe. Der Code, den ich benutzt hatte, ist,

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 
    return [categoryImages count]; 
} 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
    homePageCells *cell = (homePageCells *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cells" forIndexPath:indexPath]; 
    cell.categoryName.text = [categoryNames objectAtIndex:indexPath.row]; 

    return cell; 
} 

Ich habe versucht, die Bildschirmgröße zu erfassen und den Code verwenden, programmatisch geeignete Zellgröße Zuordnung

- (CGSize)collectionView:(UICollectionView *)collectionView 
layout:(UICollectionViewLayout *)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize sizes; 


    CGSize result = [[UIScreen mainScreen] bounds].size; 
    NSLog(@"%f",result.height); 
    if(result.height == 480) 
    { 
     //Load 3.5 inch xib 
     sizes =CGSizeMake(170.f, 170.f); 
     NSLog(@"3gs"); 
    } 
    else if(result.height == 568) 
    { 
     //Load 4 inch xib 
     sizes =CGSizeMake(130.f, 130.f); 
     NSLog(@"5s"); 

    } 
    else if(result.height == 667.000000) 
    { 
     //Load 4.7 inch xib 
     sizes =CGSizeMake(160.f, 160.f); 
     NSLog(@"6"); 

    } 
    else 
    { 
     NSLog(@"else"); 

     sizes =CGSizeMake(170.f, 165.f); 

    } 
    return sizes; 
} 

Aber ich weiß auch, dass dies nicht der richtige Weg Also bitte gib mir einen richtigen Weg damit umzugehen.

Antwort

18

Sie können dies tun, Sie müssen nicht auf Gerätegrößen überprüfen, wie wir die tableView Breite verwenden können, um die Breite der Zelle & zu berechnen, nach der wir unsere Höhe erhöhen können.

One More, was Sie CollectionViewFlowLayout & bestätigen die Delegierten & implementieren Methode unter

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

    let padding: CGFloat = 50 
    let collectionViewSize = collectionView.frame.size.width - padding 

    return CGSizeMake(collectionViewSize/2, collectionViewSize/2) 

} 

Update verwenden müssen: Swift 4,0

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     let padding: CGFloat = 50 
     let collectionViewSize = collectionView.frame.size.width - padding 

     return CGSize(width: collectionViewSize/2, height: collectionViewSize/2) 
    } 

Hinweis: bedenkt, dass ich habe die Frage beantwortet die Zellen sind quadratisch groß

+0

Danke für die Rettung meines Tages. Ich bin so dumm, ich habe nicht einmal an diese einfache Lösung gedacht. Danke vielmals! –

+0

Diese Antwort hilft mir wirklich ... Benutzer kann Polsterung je nach Anforderung ändern ... –

+0

Das hilft wirklich. Danke für die Antwort und die Frage, die Sie gestellt haben. –

1
- (CGSize)collectionView:(UICollectionView *)collectionView 
       layout:(UICollectionViewLayout *)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
CGFloat padding = 50; 
CGFloat cellSize = collectionView.frame.size.width - padding; 
return CGSizeMake(cellSize/2, cellSize/2); 
} 
8

Xcode 8: Swift 3

Ich weiß, das ist eine ältere Frage, aber ich fand ein paar Probleme mit dem akzeptierten Antwort.

Ich hatte UICollectionViewDelegateFlowLayout zu verwenden, die dann nicht CollectionViewFlowLayout ist

‚Padding‘ Int ist vom Typ und wenn Sie versuchen, es aus der Variablen collectionViewSize zu subtrahieren wirft er einen Fehler weil sie verschiedene Arten sind. Sehr einfach zu reparieren.

ich gerade hinzugefügt: CGFloat der Linie

Schließlich, während es wahrscheinlich ein besserer Weg, es zu tun, musste ich durch Einstellen der Collection vordere und hinteren Randbedingungen die Polsterung anzupassen.

Alles in allem also das ist, was mein Code wie

extension LandingPageViewController: UICollectionViewDelegateFlowLayout { 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let padding: CGFloat = 25 
    let collectionCellSize = collectionView.frame.size.width - padding 

    return CGSize(width: collectionCellSize/2, height: collectionCellSize/2) 

    } 

} 
0

Suche landete ich mit den Grenzen der Collection Probleme hatte ging in sizeForItemAtIndexPath nicht zu diesem Zeitpunkt korrekt.

Ein Update dafür wäre, die Zellen in viewWillAppear neu zu laden, um sicherzustellen, dass die Grenzen der AuflistungView korrekt sind.

Eine andere ist die UIScreen Klasse zu verwenden.

-(instancetype)init: { 
    self = [super init]; 
    if (self) { 
     width = [[UIScreen mainScreen] bounds].size.width; 
    } 
    return self; 
} 

-(CGSize)collectionView:(UICollectionView *)collectionView 
       layout:(UICollectionViewLayout *)collectionViewLayout 
sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 

    // Two columns with spacing in between 
    CGFloat size = ((width/2) - (kSpacing * 2)); 
    return CGSizeMake(size, size); 

} 

In diesem Fall ist ich instanziieren die Delegaten als separate Klasse (daher die init), aber es kann genauso gut als Erweiterung erfolgen.