2016-07-15 41 views
5

Chcę wyświetlić tylko dwie komórki z rzędu, bez względu na rozmiar ekranu iPhone'a. Podobnie jak, End result requiredWyświetl tylko dwie kolumny, z wieloma wierszami w widoku CollectionView przy użyciu storyboardu

Mój scenariusz zawiera UICollectionView, połączony wiązaniami.

Storyboard preview

Ustawienia storyboard do UICollectionView jest enter image description here

Teraz, gdy uruchomię to w 6, 5s lub poniżej, tylko jedna komórka pojawia się w wierszu. Kod ja używany jest

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

Próbowałem wykrywania rozmiaru ekranu i przypisanie odpowiedniego rozmiaru komórek programowo przy użyciu kodu,

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

Ale wiem też, że to nie jest właściwa droga , więc proszę, daj mi właściwy sposób, aby sobie z tym poradzić.

Odpowiedz

18

Możesz to zrobić, nie musisz sprawdzać rozmiarów urządzenia, ponieważ możemy użyć szerokości tableView do obliczenia szerokości komórki &, zgodnie z którą możemy podnieść naszą wysokość.

jeszcze jedno trzeba użyć CollectionViewFlowLayout & potwierdzić delegata & wdrożyć metody poniżej

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) 

} 

Aktualizacja: 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) 
    } 

Uwaga: Mam odpowiedział na pytanie, biorąc pod uwagę komórki mają rozmiar kwadratowy

+0

Dzięki za uratowanie mojego dnia. Jestem taki głupi, nawet nie myślałem o tym prostym rozwiązaniu. Wielkie dzięki! –

+0

Ta odpowiedź naprawdę mi pomaga ... Użytkownik może zmienić wypełnienie zgodnie z wymogami ... –

+0

To naprawdę pomaga. Dziękuję za odpowiedź i pytanie, które podniosłeś. –

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

Wiem, że to pytanie jest starszy, ale znalazłem kilka problemów z przyjętymi odpowiedź.

musiałem użyć UICollectionViewDelegateFlowLayout, która nie jest CollectionViewFlowLayout

Następnie

W nim „Dopełnienie” jest typu int i podczas próby odjąć go od zmiennej collectionViewSize zgłasza błąd ponieważ są to różne typy. Bardzo łatwa do naprawienia.

Właśnie dodałem: CGFloat do linii

Wreszcie, podczas gdy nie ma chyba lepszego sposobu, aby to zrobić, musiałem dopasować dopełnienie regulując CollectionView początkowe i końcowe ograniczeń.

Więc w tym wszystkim jest to, co mój kod skończyło się patrząc jak

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

miałem problemy z granicami na CollectionView przeszedł do sizeForItemAtIndexPath nie jest poprawne w danej chwili.

Jedną z poprawek jest ponowne załadowanie komórek w viewWillAppear, aby upewnić się, że granice kolekcji są poprawne.

Kolejnym jest użycie klasy UIScreen.

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

} 

W tym przypadku mam instancji delegata jako osobnej klasy (stąd startowy), ale można to zrobić równie dobrze jako przedłużenie.