6

Więc mam UICollectionView z niestandardowym UIViews dla każdej komórki. UIView zajmuje cały ekran i możesz poziomo nawigować do każdego z 4 różnych UIView/komórek. To wszystko działa dobrze i używa pager do wskazania, na której stronie widoku kolekcji jesteś.UICollectionView pozioma ciągła pętla

Rozejrzałem się po Google i tym podobne, aby zobaczyć, czy mógłbym go przywrócić do początku po przejściu przez ostatnią komórkę. Na przykład:

Zaczynam od trzeciej komórki, przechodzę do czwartej, a kiedy przesuniemy w prawo, wróci do pierwszej komórki (pagera będzie odzwierciedlało, że jesteś na pierwszej stronie) i kontynuuje dalej od tego.

Czy to jest łatwe? Czy może czegoś brakuje?

Dzięki, Jake

Odpowiedz

3

Trzeba tylko 3 UIViews i przytrzymaj obraz na lewo od bieżącego widoku, obraz po prawej stronie bieżącego widoku i środkowej widzenia, ten, który jest aktualnie na ekranie.

Więc powiedzmy, że mamy UIImages ABCD i UIViews 1 2 i 3

patrzymy View 2, obraz B. Page lewo zabierze nas do obrazu A, strona prawa do wizerunku C.

Przesuwając palcem w lewo/w prawo, widok 3 staje się widokiem na ekranie z obrazkiem C. Gdy stronicowanie zostaje zatrzymane, zamieniasz zawartość widoków w taki sposób, że użytkownik ponownie patrzy na środek UIView2, z obrazkiem C. Widok 1 zawiera obraz B, widok 3 ma obraz D.

Ponownie przewiń w prawo i wykonaj tę samą kolejkę losową. Teraz masz

View 1 -> image C 
View 2 -> image D 
View 3 -> image A 

Następna strona prawo

View 1 -> image D 
View 2 -> image A 
View 3 -> image B 

tak dalej, ad infinitum w obu kierunkach

Jest miły WWDC wideo na ten temat od roku 2011. Warto wykopywania. It's the UIScrollView demo video (Documentation as PDF) Nie potrzebujesz do tego Widoku Kolekcji, chociaż nie ma powodu, dla którego nie powinieneś ...

+0

I obawiam się, że jest to nieco bardziej skomplikowane niż obrazy w widoku, widoki te są ładowane z storyboardu (w przeciwieństwie do używania stalówek i ładowania ich) i każdy ma swoje własne kontrolery widoku i takie, które są wprowadzane. Ponadto zalecane jest korzystanie z widoku interfejsu, choć nie jest to bezwzględnie obowiązkowe, aby zachować spójność z resztą aplikacji. Czy myślisz, że mógłbym ustawić liczbę komórek na naprawdę dużą liczbę, a następnie przenieść zawartość i wszystko to do następnej komórki? (Myślę, że gdzieś to widziałem, ale to musi mieć problemy z wydajnością?) – JakeTheBraek

+0

Nawet jeśli jest bardziej złożona, zasada powinna być taka sama, tasuje się dane dotyczące kopii zapasowej, gdy widok kolekcji jest w stanie spoczynku. Zrobiłem to z powodzeniem na przeglądarkach, widokach tabel i hierarchiach widoków tabel w widokach tabel bez żadnych problemów. Jeśli nie chcesz zepsuć danych z kopii zapasowej, możesz pobrać go do magazynu danych tymczasowych i zignorować go w zamian? Zrobiłem też rzecz o dużej liczbie komórek, ale to tylko po to, aby utrzymać iluzję, podczas gdy żyjemy - przewijając dane. To nigdy nie będzie nieomylne. – foundry

+0

Dzięki za pomoc On był, Teoria tutaj wydaje się być dobra i powinna przetłumaczyć ok na moją kolekcję. Zamierzam spróbować zduplikować pierwszą komórkę po ostatniej i na odwrót i włożyć ją do komórek. Po wykonaniu spowolnienia ruchu, przenieś użytkownika do "prawdziwej" pierwszej komórki lub "prawdziwej" ostatniej komórki w zależności od kierunku. Trzymam kciuki. – JakeTheBraek

2

Gotowy na tę gorączkę?

Więc w viewDidLoad moim głównym widoku kontrolera za I zidentyfikować poglądy załadować do komórek uicollectionview w tablicy:

NSArray *vcs = [@"view5", @"view1", @"view2", @"view3", @"view4", @"view5", @"view1"] 

ja również ustawić liczyć nasz pagecontrol do:

self.pageControl.numberOfPages = vcs.count - 2; // for the fake first and last cells 

Potem instancję viewcontrollers w viewDidLoad w głównym widoku kontrolera, a także ustaw alfa dla widoku kolekcji na 0. Następnie w naszym scrollViewDidEndDecelerating obsługuję karuzelę (przechodzę z ostatniej komórki do pierwszej i pierwszej komórki do ostatniej) i aktualizuję stronęControl do refle ct "prawdziwy" numer strony.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    // Snaps into the cell  
    CGFloat pageWidth = scrollView.frame.size.width; 
    float fractionalPage = scrollView.contentOffset.x/pageWidth; 
    NSInteger page = lround(fractionalPage); 

    self.pageControl.currentPage = page - 1; // because our first cell is the last cell for animation purposes only 

    // Carousel from first to last and last to first while updating pagecontrol 
    if (page == 0) { 
     [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.activeGaugeClusters.count - 2 inSection:0] 
            atScrollPosition:UICollectionViewScrollPositionLeft 
              animated:NO]; 
     // Set our pagecontrol circles to the appropriate page indicator   
     self.pageControl.currentPage = self.activeGaugeClusters.count - 2; 

    } else if (page == self.activeGaugeClusters.count -1) { 
     [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] 
            atScrollPosition:UICollectionViewScrollPositionLeft 
              animated:NO]; 
     self.pageControl.currentPage = 0; 
    } 
} 

Następnie w realizacji CollectionView I wykonaj następujące czynności:

numberOfItemsInSection = vcs.count 

i viewDidAppear do ładowania pierwszą komórkę (czy jest to komórka w indexPath.row == 1 lub 2 lub 3 .. . (1 jako pierwsza prawdziwa strona nie 0)

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.lastGaugePanel inSection:0] 
           atScrollPosition:UICollectionViewScrollPositionLeft 
             animated:NO]; 
    self.pageControl.currentPage = self.lastGaugePanel - 1; 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.collectionView.alpha = 1.0; 
    }]; 
} 

myślę, że około podsumowuje. reszta wdrożeń zarówno głównego vc i CollectionView są standardowe. Więc teraz mam widok zbiórki które ładują inne widoki i ich VC, z których każda ma własną animację lub cokolwiek innego. Zapisuję plik indexPath.row w pliku NSUserDefaults, aby komórka, w której znajdowałem się podczas opuszczania, była pierwszą komórką wyświetlaną przy następnym obciążeniu.

Nadzieje to pomaga kogoś, wiem, że to nie dla mnie, niestety korzystanie z bibliotek 3rd party zniechęcił więc musiałem zbudować ten zły chłopiec się (znowu z pomocą @He Czy dzięki!)

+0

Chciałbyś moją wersję matrycy! Używałem nakładających się tableViews i tableViews w tableViews .... – foundry