2013-01-24 19 views
52

Używam UICollectionView z dwoma prototypowymi komórkami. Prototypowe komórki mają różne szerokości i zawierają różne elementy sterujące (widok obrazu i widok WWW). Z całą pewnością zwracam poprawną komórkę prototypową dla danego indeksu (wszystkie komórki wyświetlają poprawną treść), ale prototypowy rozmiar komórki jest ignorowany, a zamiast tego używany jest rozmiar elementu kolekcji. To nie tak, że ręcznie ustawiam rozmiar. Jaki jest cel pozwalający na rozmiar prototypowej komórki w storyboardie, jeśli właściwość jest po prostu ignorowana, gdy jest wyświetlana?iOS UICollectionView prototypowa właściwość rozmiaru komórki zignorowana

Odpowiedz

151

Rozmiar komórki w edytorze scenorysów służy tylko zaprojektowaniu komórki. Ponieważ każda prototypowa komórka może mieć inny rozmiar, UICollectionView nie wie, którą wielkość komórki wybrać dla wszystkich komórek. Dlatego ustawiasz rzeczywisty rozmiar, który chcesz użyć dla komórek osobno. Możesz to zrobić w projektancie, wybierając widok kolekcji i ustawiając kontrolkę Wielkość i wysokość rozmiaru komórki w rozmiarze "Rozmiar w perspektywie zbierania".

Można również zastąpić następującą metodę i zwrócić obiekt CGSize, który określa rozmiar, który ma być używany dla każdej komórki. Stosując tę ​​metodę, można rzeczywiście mieć każda komórka być inny rozmiar:

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

Przykład:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return CGSizeMake(100, 100); 
} 

Twój kontroler widok musi być delegatem UICollectionViewDelegateFlowLayout celem dla tej metody można nazwać. Więc nie zapomnij dodać, że oświadczenie delegata do pliku .h Pana zdaniem regulatora, takich jak:

@interface MyViewController() <UICollectionViewDelegateFlowLayout> 
+0

Użyłem niestandardowego wyciągnięcia, aby dodać warstwy gradientu, uilim i uiimage w komórce widoku uicollection, a rysunek nie był prawidłowy. Umieszczenie tego kodu w moim głównym kontrolerze widoku rozwiązało problem. – MGM

+1

Jeśli wszystkie komórki mają ten sam rozmiar, bardziej efektywnym sposobem określenia rozmiaru jest ustawienie go w 'UICollectionViewFlowLayout'. na przykład 'flow.itemSize = CGSizeMake (50,100);' –

+1

Ale czy jest jakiś sposób, aby programowo uzyskać dostęp do prototypowej komórki z metody '-collectionView: layout: sizeForItemAtIndexPath:'? (Zapisywanie numeru komórki za pomocą identyfikatora ponownego użycia nie działa, ponieważ to kończy się wywołaniem metody określania rozmiaru, co powoduje nieskończoną pętlę). – erikprice

0

Jeśli wszystkie komórki są tego samego rozmiaru, należy po prostu ustawić właściwości wielkości komórce UICollectionView do danego tak samo jak właściwości rozmiaru UICollectionViewCell.

17

Jeśli wszystkie komórki są tej samej wielkości i można ustawić itemSize na UICollectionViewFlowLayout

Przykład:

((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100); 
+2

Wydaje się, że kolekcjaViewLayout.itemSize nie jest dostępna w systemie IOS6 – Sam

0

Można ustawić wielkość UICollectionViewCell w UICollectionView właściwości.

W Storyboard, Wybierz Collection View na Document Outline, a następnie zmodyfikuj swój Cell Size w Size Inspector.

Należy zmienić typ rozmiaru komórki na Domyślny, jeśli jest niestandardowy.

4

Swift, działa na najnowsze iOS.

(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize 

nie mam wystarczająco dużo punktów, aby odpowiedzieć na Sam, ale kluczem jest to, że nie jest UICollectionViewLayout ale UICollectionViewFlowLayout.

1

W Swift można wywołać metodę delegowania sizeForItemAtIndexPath, aby ustawić rozmiar dla każdej komórki.

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

     if indexPath.row == 0 { 
       // Set the size for cell no. 0 
     }else if indexPath.row == 1 { 
       // Set the size for cell no. 1 
     } 
    } 

Mam nadzieję, że to pomaga. Dzięki!

0

Użyj domyślnego elementu Delegata. . .

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize mElementSize; 
    mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60); 
    return mElementSize; 
} 
Powiązane problemy