2016-12-05 11 views
6

Zauważyłem, że komórki zawsze będą zgodne z definicją w inspektorze rozmiaru. Nawet jeśli już zastosowałem UICollectionViewDelegateFlowLayout.Jak zmienić rozmiar komórek widoku kolekcji zgodnie z rozmiarem ekranu urządzenia?

enter image description here

enter image description here

Więc tak to wygląda. Ale chcę, żeby komórki wyglądały raczej jak na mniejszym ekranie iPhone'a.

enter image description here

+0

używasz szybkiego? –

+0

Musisz użyć mnożnika z superview do tworzenia komórki, niż automatycznie dostosuje się do rozmiaru ekranu. –

+0

Tak, używam szybkiego. Zauważyłem też coś, komórki widoku kolekcji zdają się podążać za rozmiarem komórki zdefiniowanym w Inspektorze rozmiarów. Nawet jeśli programowo zmieniam rozmiar komórki za pomocą metody collectionViewLayout. –

Odpowiedz

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

    CGFloat height = self.view.frame.size.height; 
    CGFloat width = self.view.frame.size.width; 
    // in case you you want the cell to be 40% of your controllers view 
    return CGSizeMake(width*0.4,height*0.4) 
} 
+0

Czy mogę umieścić ten kod wewnątrz kolekcji funcView (collectionView: UICollectionView, kolekcja layoutViewViewout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize ......? –

+2

jest to metoda UICollectionViewDelegateFlowLayout. UICollectionViewDelegateFlowLayout dziedziczy po UICollectionViewDelegate, co oznacza, że ​​powinieneś zaimplementować tę metodę i zmienić protokół UICollectionViewDelegate na UICollectionViewDelegateFlowLayout po dodaniu tej metody, w przeciwnym razie ta metoda nie będzie nazywać się –

+0

. Zauważyłem też coś, komórki widoku kolekcji zdają się podążać za rozmiarem komórki zdefiniowanym w Inspektorze rozmiarów. Nawet jeśli programowo zmieniam rozmiar komórki za pomocą metody collectionViewLayout –

2

Jednym ze sposobów, aby to zrobić jest utrzymanie proporcji komórki i podać rozmiar tak:

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
          sizeForItemAt indexPath: IndexPath) -> CGSize { 
    if (screenheight < 667) { 
     return CGSize(width: 155, height: 200) 
    } else if (screenheight < 736) { 

     return CGSize(width: 182, height: 220) 

    } else { 
     return CGSize(width: 200, height: 230) 

    } 
} 
+0

Też zauważyłem coś, komórki widoku kolekcji zdają się podążać za rozmiarem komórki zdefiniowanym w Inspektorze rozmiarów. Nawet jeśli programowo zmieniam rozmiar komórki za pomocą metody collectionViewLayout: –

2

Należy spróbować za pomocą prostego równania podczas ustawiania rozmiaru komórek zamiast numeru jak tak :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return CGSize(width: view.frame.width/2, height: 350) 
    } 

dzieląc ją przez 2 będzie oznaczać, że komórka zawsze połowa wielkości ekranów, zabierając i rodzaj funkcji minimumLineSpacing s i/lub i metody UIEdgeInset, które wywołałeś. Mam nadzieję że to pomoże.

+0

Zauważyłem również, że komórki widoku kolekcji zdają się podążać za rozmiarem komórki zdefiniowanym w Inspektorze rozmiarów.Nawet jeśli programowo zmieniam rozmiar komórki za pomocą metody collectionViewLayout –

0

W swift 3 można zmienić rozmiar komórki widoku kolekcji, jak na ekranie, używając właściwości collectionViewLayout.

tj.

let numberOfCell = 3 
    let cellSpecing = 10 
    if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { 
     layout.itemSize = CGSize(width: (screenSize.width - (cellSpecing * (numberOfCell + 1)))/numberOfCell, height: cellHeight) 
     layout.invalidateLayout() 
    } 
0
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

    let theWidth = (_screenSize.width - (15*3))/2 // it will generate 2 column 
    let theHeight = (_screenSize.height - (10*2))/3 // it will generate 3 Row 
    return CGSize(width: theWidth ,height: theHeight) 
} 
+0

Też zauważyłem coś, komórki widoku kolekcji wydają się podążać za rozmiarem komórki zdefiniowanym w Inspektorze rozmiarów. Nawet jeśli programowo zmieniam rozmiar komórki za pomocą metody collectionViewLayout –

1

Według mojego doświadczenia trzeba użyć UICollectionView metod, aby uzyskać konkretny widok kolekcja rozmiar komórek urządzenia jak na poniższych metod można uzyskać szerokość dynamiczne & wysokość widzenia zbiór komórce.

// Dynamic width & height 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    float cellSize = collectionView.frame.size.width/values.count; 
    return CGSizeMake(cellSize - 10, collectionView.frame.size.height); 
} 

//For top/bottom/left/right padding method 
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
{ 
    return UIEdgeInsetsMake(0, 0, 0, 1); 
} 



- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    float width = collectionView.frame.size.width; 
    float spacing = [self collectionView:collectionView layout:collectionViewLayout minimumInteritemSpacingForSectionAtIndex:section]; 
    int numberOfCells = (width + spacing)/(cellSize + spacing); 
    int inset = (width + spacing - numberOfCells * (cellSize + spacing))/2; 

    return UIEdgeInsetsMake(0, inset, 0, inset); 
} 
- (CGFloat)collectionView:(UICollectionView *) collectionView layout:(UICollectionViewLayout *)collectionViewLayout 
minimumInteritemSpacingForSectionAtIndex:(NSInteger) section 
{ 
    return 1.0; 
} 

Mam nadzieję, że pomoże ci to zaprojektować komórkę w zależności od wielkości urządzenia.

2

Swift 4

można zrobić coś takiego:

class yourClassName: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
      return CGSize(width: self.myCollectionView.frame.height/6 * 5, height: self.myCollectionView.frame.height/6 * 5) 

     } 


} 

self.myCollectionView jest odwołaniem od ciebie kolekcji widoku elementu
ważne jest, aby wdrożyć UICollectionViewDelegateFlowLayout

A ponieważ nie zmieści w innej komórce będziesz miał tylko jeden rząd.

Powiązane problemy