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: UICollectionViewCell expand/collapse o rozmiarze wewnętrznym
Odpowiedz
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
Dobra robota, spędziłam ostatnią noc zastanawiając się i powiedziałam "odpowiem na to jutro" i bum, tutaj jest – MoMo
Czy jest jakiś sposób, aby automatyczny układ automatycznie obliczył wysokość? – almas
yes, zwróć ten rozmiar dla komórki: - CGSize CellSize = [system twojego CellLayoutSizeFittingSize: UILayoutFittingCompressedSize withHorizontalFittingPriority: UILayoutPriorityDefaultHigh verticalFittingPriority: UILayoutPriorityDefaultLow]; – Mihawk
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
można dodać co próbowałem do tej pory i jakie wyniki dostajesz? – MoMo