Mam UICollectionView
przewijanie w poziomie i zawsze są 2 komórki obok siebie na całym ekranie. Potrzebuję, aby przewijanie zatrzymało się na początku komórki. Po włączeniu stronicowania widok kolekcji przewija całą stronę, czyli 2 komórki jednocześnie, a następnie zatrzymuje się.
Muszę włączyć przewijanie o pojedynczą komórkę lub przewijanie o wiele komórek z zatrzymaniem na krawędzi komórki.
Próbowałem utworzyć podklasę UICollectionViewFlowLayout
i zaimplementować metodę targetContentOffsetForProposedContentOffset
, ale do tej pory udało mi się tylko złamać widok kolekcji i przestał się przewijać. Czy istnieje prostszy sposób na osiągnięcie tego i jak, czy naprawdę muszę zaimplementować wszystkie metody UICollectionViewFlowLayout
podklasy? Dzięki.
źródło
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
i wyłącz stronicowanieOdpowiedzi:
OK, więc znalazłem rozwiązanie tutaj: targetContentOffsetForProposedContentOffset: withScrollingVelocity bez podklasy UICollectionViewFlowLayout
Powinienem był szukać na
targetContentOffsetForProposedContentOffset
początku.źródło
po prostu zastąp metodę:
źródło
Stronowanie poziome z niestandardową szerokością strony (Swift 4 i 5)
Wiele przedstawionych tutaj rozwiązań powoduje dziwne zachowanie, które nie przypomina poprawnie zaimplementowanego stronicowania.
Jednak rozwiązanie przedstawione w tym samouczku nie wydaje się mieć żadnych problemów. Po prostu wygląda jak doskonale działający algorytm stronicowania. Możesz to wdrożyć w 5 prostych krokach:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
ten sposób:collectionView.delegate = self
UICollectionViewDelegate
poprzez rozszerzenie:extension YourType: UICollectionViewDelegate { }
Dodaj następującą metodę do rozszerzenia implementującego
UICollectionViewDelegate
zgodność i ustaw wartość dlapageWidth
:Dodaj następującą metodę do rozszerzenia implementującego
UICollectionViewDelegate
zgodność, ustaw tę samą wartość dlapageWidth
(możesz również przechowywać tę wartość w centralnym miejscu) i ustaw wartość dlacollectionViewItemCount
:źródło
Pop back (against velocity)
część być:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Uwaga.centeredHorizontally
.left
był w porządku.left
nie działa zgodnie z oczekiwaniami. Wydawało się, że przesuwa celę zbyt daleko do tyłu @fredpiSzybka 3 wersja odpowiedzi Evyi:
źródło
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
+ mod
+ Double(0.5)
Oto najłatwiejszy sposób, w jaki znalazłem to w Swift 4.2 dla przewijania poziomego :
Używam pierwszej komórki
visibleCells
i przewijam do tego momentu, jeśli pierwsza widoczna komórka pokazuje mniejszą połowę swojej szerokości, przewijam do następnej.Jeśli zbiór przewijać w pionie , wystarczy zmienić
x
przezy
iwidth
przezheight
źródło
Oto moja implementacja w Swift 5 dla pionowego stronicowania opartego na komórkach:
Kilka uwag:
itemSize
faktycznie pasuje on do rozmiaru przedmiotu, ponieważ często stanowi to problem, zwłaszcza podczas używaniacollectionView(_:layout:sizeForItemAt:)
, zamiast tego użyj niestandardowej zmiennej z itemSize.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Oto wersja pozioma (nie przetestowałem jej dokładnie, więc proszę wybaczyć wszelkie błędy):
Ten kod jest oparty na kodzie, którego używam w moim osobistym projekcie, możesz go sprawdzić tutaj , pobierając go i uruchamiając przykładowy cel.
źródło
.fast
zamiastUIScollViewDecelerationRateFast
Częściowo na podstawie odpowiedzi StevenOjo. Przetestowałem to przy użyciu przewijania poziomego i bez Bounce UICollectionView. cellSize to rozmiar CollectionViewCell. Możesz dostosować współczynnik, aby zmodyfikować czułość przewijania.
źródło
Podejście 1: Widok kolekcji
flowLayout
jestUICollectionViewFlowLayout
własnościąPodejście 2: Kontroler wyświetleń strony
Możesz użyć,
UIPageViewController
jeśli spełnia Twoje wymagania, każda strona miałaby oddzielny kontroler widoku.źródło
To jest prosty sposób na zrobienie tego.
Sprawa jest prosta, ale w końcu dość powszechna (typowy scroller miniaturek ze stałym rozmiarem komórki i stałą przerwą między komórkami)
Zwróć uwagę, że nie ma powodu, aby wywoływać scrollToOffset lub zagłębiać się w układy. Natywne zachowanie przewijania już robi wszystko.
Pozdrawiam wszystkich :)
źródło
collectionView.decelerationRate = .fast
bliższe mimiczne domyślne stronicowanie.Coś jak odpowiedź evyi, ale trochę płynniejsza, ponieważ nie ustawia parametru targetContentOffset na zero.
źródło
zmodyfikuj odpowiedź Romulo BM na słuchanie z prędkością
źródło
Szybki 5
Znalazłem sposób, aby to zrobić bez podklasy UICollectionView, po prostu obliczając contentOffset w poziomie. Oczywiście bez isPagingEnabled ustawiono wartość true. Oto kod:
źródło
Oto moja wersja w Swift 3. Oblicz przesunięcie po zakończeniu przewijania i dostosuj przesunięcie za pomocą animacji.
collectionLayout
jestUICollectionViewFlowLayout()
źródło
Możesz także utworzyć fałszywy widok przewijania do obsługi przewijania.
Poziomo lub pionowo
źródło
Ok, więc proponowane odpowiedzi nie zadziałały dla mnie, ponieważ zamiast tego chciałem przewijać sekcje, a zatem mieć różne rozmiary stron
Zrobiłem to (tylko w pionie):
W tym przypadku każdy rozmiar strony obliczam wcześniej, używając wysokości sekcji + nagłówek + stopka, i przechowuję go w tablicy. To jest
pagesSizes
członekźródło
To jest moje rozwiązanie, w Swift 4.2 chciałbym, żeby ci pomogło.
źródło
źródło
Oryginalna odpowiedź Олень Безрогий zawierała problem, więc w ostatnim widoku zbioru komórek przewijano do początku
źródło
Oto mój sposób, aby to zrobić, używając
UICollectionViewFlowLayout
do zastąpieniatargetContentOffset
:(Chociaż w końcu nie używam tego i zamiast tego używam UIPageViewController).
źródło
Możesz skorzystać z następującej biblioteki: https://github.com/ink-spot/UPCarouselFlowLayout
Jest to bardzo proste i często nie musisz myśleć o szczegółach, jakie zawierają inne odpowiedzi.
źródło
utworzyłem tutaj niestandardowy układ widoku kolekcji , który obsługuje:
to jest tak proste, jak:
możesz po prostu dodać PagingCollectionViewLayout.swift do swojego projektu
lub
dodaj
pod 'PagingCollectionViewLayout'
do swojego pliku podfileźródło