2015-07-21 16 views
8

Mam widok kolekcji z niestandardowym układem przepływu i wieloma różnymi komórkami o różnej wysokości. Szerokość widoku kolekcji zmienia się na obrót urządzenia, więc szerokość komórek musi się odpowiednio zmienić. Aby to działało, zaimplementowałem metodę "sizeForItemAtIndex" i zwracam różne rozmiary w zależności od aktualnej orientacji interfejsu. Większość komórek nie zmienia ich wysokości, jednak istnieje jedna komórka, którą chcę rozwinąć i zwinąć za każdym razem, gdy użytkownik ją kliknie. Można założyć, że komórka ma tylko jeden UILabel z jednym lub kilkoma wierszami tekstu. Gdy komórka pojawia się po raz pierwszy, liczba linii jest ustawiona na 1, a gdy użytkownik kliknie komórkę, liczba linii jest ustawiona na 0, a tutaj komórka powinna użyć wewnętrznego rozmiaru etykiety, aby automatycznie zmienić jej wysokość . Jak mogę osiągnąć ten efekt? Oto przykład tego, co powinno wyglądać następująco: enter image description hereUICollectionViewCell expand/collapse o rozmiarze wewnętrznym

+0

można dodać co próbowałem do tej pory i jakie wyniki dostajesz? – MoMo

Odpowiedz

11

Wykonaj następujące kroki:

1). Tworzyć logiczną zmienną o nazwie isExpanded zarządzać rozwinąć/zwinąć

2.) dodaj cel i działania na pokaz przycisk więcej

[yourCellName.btnShowMore addTarget:self action:@selector(ShowMoreButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 

3.) W sizeForItemAtIndexPath do zarządzania wysokość, dodać:

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

if (isExpanded && indexPath.row == 0) { 
     return CGSizeMake(CGRectGetWidth(self.view.frame), calculated height for the expanded cell); 
    } 
    return CGSizeMake(CGRectGetWidth(self.view.frame), default height); 
} 

4) Następnie, w sposobie ShowMoreButtonClicked

- (void)ShowMoreButtonClicked{ 
    if (isExpanded) { 
     isExpanded = FALSE; 
     [collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]]; 

    } 
    else { 
     isExpanded = TRUE; 
     [collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]]; 
    }} 

5.) Dodaj tę linię w cellForItemAtIndexPath

[yourCellName layoutIfNeeded]; 

6.) Budowa & run

+0

Dobra robota, spędziłam ostatnią noc zastanawiając się i powiedziałam "odpowiem na to jutro" i bum, tutaj jest – MoMo

+0

Czy jest jakiś sposób, aby automatyczny układ automatycznie obliczył wysokość? – almas

+0

yes, zwróć ten rozmiar dla komórki: - CGSize CellSize = [system twojego CellLayoutSizeFittingSize: UILayoutFittingCompressedSize withHorizontalFittingPriority: UILayoutPriorityDefaultHigh verticalFittingPriority: UILayoutPriorityDefaultLow]; – Mihawk

1

Poprzedniego odpowiedź jest dobra, ale jeśli chcesz trochę animacji trzeba zrobić, to trzy etapy:

1.Invalidate swoją collectionViewLayout

self.collectionView.collectionViewLayout.invalidateLayout() 

2.Reload pożądane indexPath lub wszystkich danych wewnątrz bloku performBatchUpdates

collectionView.performBatchUpdates({ 
      self.collectionView.reload(at: DESIRED_INDEXPATH) 
     }, completion: nil) 

3.Return nowa wysokość oblicza się metodą sizeForItemAtIndexpath delegata

Powiązane problemy