Po UICollectionView
raz pierwszy używam aplikacji na iPada. Ustawiłem UICollectionView
tak, aby jego rozmiar i rozmiar komórki były takie same, czyli tylko raz komórka jest wyświetlana na raz.
Problem: Teraz, gdy użytkownik przewija UICollectionView, muszę wiedzieć, która komórka jest widoczna, muszę zaktualizować inne elementy interfejsu użytkownika po zmianie. Nie znalazłem do tego żadnej metody delegata. Jak mogę to osiągnąć?
Kod:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
Co próbowałem:
Zgodnie UICollectionView
z tym UIScrollView
, otrzymałem, gdy przewijanie użytkownika kończy się UIScrollViewDelegate
metodą
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Ale wewnątrz powyższej funkcji, jak mogę uzyskać bieżący widoczny indeks komórki UICollectionView
???
ios
objective-c
ipad
uicollectionview
Irfan DUŃSKI
źródło
źródło
Odpowiedzi:
Metoda [collectionView visibleCells] daje ci wszystkie potrzebne tablice visibleCells. Użyj go, kiedy chcesz
Zaktualizuj do Swift 5:
źródło
scrollViewDidScroll:
delegata zapewnia aktualizacje widoku przewijania po zakończeniu przewijania (i prawdopodobnie jest tutaj lepszym wyborem). W przeciwieństwie doscrollViewDidEndDecelerating:
metody delegata, która jest wywoływana tylko wtedy, gdy widok przewijania „ grinduje do zatrzymania [z dużego przewijania] ” (patrz nagłówek UIScrollView)...DidScroll
jest wywoływany wiele razy, nawet podczas krótkiego przewijania. Może, ale nie musi, być dobrą rzeczą, w zależności od tego, co chce się robić.indexPathsForVisibleItems
może działać w większości sytuacji, ale czasami zwraca tablicę z więcej niż jedną ścieżką indeksu i może być trudne znalezienie tego, który chcesz. W takich sytuacjach możesz zrobić coś takiego:Działa to szczególnie dobrze, gdy każdy element w widoku kolekcji zajmuje cały ekran.
Szybka wersja
źródło
visibleIndexPath
czasami będzie zero, więcif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Swift 5 :
Odpowiedzi robocze połączone w Swift 2.2:
źródło
Ze względu na kompletność ta metoda okazała się dla mnie skuteczna. Było to połączenie metod @Anthony & @ iAn.
źródło
Prawdopodobnie najlepiej będzie użyć metod UICollectionViewDelegate: (Swift 3)
źródło
didEndDisplaying
do dokumentów: informuje delegata, że określona komórka została usunięta z widoku kolekcji. Użyj tej metody, aby wykryć, kiedy komórka została usunięta z widoku kolekcji, w przeciwieństwie do monitorowania samego widoku, aby zobaczyć, kiedy znika. Więc nie sądzę, żedidEndDisplaying
jest wywoływany, gdy komórka jest wyświetlana.Chcę tylko dodać dla innych: z jakiegoś powodu nie otrzymałem komórki, która była widoczna dla użytkownika, gdy przewijałem do poprzedniej komórki w collectionView z pagingEnabled.
Więc wstawiam kod wewnątrz dispatch_async, aby nadać mu trochę powietrza i to działa dla mnie.
źródło
DispatchQueue.main.async {
kiedy połączenie inicjuje coś takiego jakfunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
jak wspomniano powyżej. Myślę, że problem gdzieś w UIKit jest tak naprawdę w moim przypadku taki sam jak ta odpowiedź.źródło
Swift 3.0
Najprostsze rozwiązanie, które da ci indexPath dla widocznych komórek.
zwróci tablicę indexpath.
Po prostu weź pierwszy obiekt z takiej tablicy.
Myślę, że powinno działać dobrze również z Objective - C.
źródło
UICollectionView aktualny widoczny indeks komórek: Swift 3
źródło
konwersja odpowiedzi @ Anthony'ego na Swift 3.0 działała idealnie dla mnie:
źródło
Możesz użyć
scrollViewDidEndDecelerating
: do tegoźródło
To stare pytanie, ale w moim przypadku ...
źródło
Sprawdź również ten fragment
źródło
W tym wątku jest tak wiele rozwiązań, które działają dobrze, jeśli komórka zajmuje pełny ekran, ale używają granic widoku kolekcji i punktów środkowych widocznego prostego Jednak jest proste rozwiązanie tego problemu
w ten sposób możesz uzyskać indexPath widocznej komórki. Dodałem DispatchQueue, ponieważ jeśli przesuniesz szybciej i przez krótką chwilę zostanie wyświetlona następna komórka, to bez dispactchQueue otrzymasz indexPath krótko pokazanej komórki, a nie komórki, która jest wyświetlana na ekranie.
źródło
spróbuj tego, to działa. (w poniższym przykładzie mam na przykład 3 komórki).
źródło
Swift 3 i Swift 4:
Jeśli chcesz pokazać rzeczywistą liczbę, możesz dodać +1
źródło