6

Quindi ho un UICollectionView con Uiviews personalizzate per ogni cella. L'UIView occupa l'intero schermo e puoi navigare orizzontalmente in ognuna delle 4 diverse UIView/celle. Tutto funziona perfettamente e utilizza un cercapersone per indicare la pagina della vista della raccolta su cui ti trovi.UICollectionView loop continuo orizzontale

Mi sono guardato in giro su google e mi piacerebbe vedere se riuscivo a farlo tornare all'inizio dopo aver passato l'ultima cella. Quindi per esempio:

Inizio dalla terza cella, vai al 4 °, poi quando scorro verso destra, tornerà alla prima cella (il cercapersone rifletterà che sei sulla prima pagina) e continua da lì.

È facile? O mi sta sfuggendo qualcosa?

Grazie, Jake

risposta

3

Hai solo bisogno di 3 UIViews, per contenere l'immagine a sinistra della visualizzazione corrente, l'immagine a destra della vista corrente, e la vista di mezzo, quello che è attualmente sullo schermo.

Quindi, consente di dire che abbiamo UIImages ABCD e UIViews 1 2 e 3

Stiamo guardando View 2, immagine B. pagina sinistra ci porterà ad un'immagine, giusta pagina all'immagine C.

Mentre scorri verso sinistra/pagina verso destra, la vista 3 diventa la visualizzazione su schermo con l'immagine C. Quando l'impaginazione si ferma, puoi scambiare il contenuto delle viste in modo che l'utente stia guardando di nuovo a metà UIView2, con l'immagine C. La vista 1 ha l'immagine B, la vista 3 ha l'immagine D.

Scorri nuovamente a destra, e fai lo stesso shuffle. Ora avete

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

Pagina successiva destra

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

così via, all'infinito in entrambe le direzioni

C'è un bel video WWDC su questo argomento a partire dal 2011. Il suo valore scavando. It's the UIScrollView demo video (Documentation as PDF) Non è necessario disporre di viste di raccolta per fare questo, anche se non vi è alcun motivo per cui non si dovrebbe ...

+0

I temo che sia un po 'più complicato delle immagini all'interno della vista, queste viste sono caricate dallo storyboard (al contrario di usare i pennini e caricandole dentro) e ognuna di esse ha i propri controller di visualizzazione e tali da essere integrati. Inoltre, l'uso di uicollectionview, anche se non assolutamente obbligatorio, è fortemente raccomandato per mantenere la coerenza con il resto dell'app. Pensi che potrei impostare il numero di celle su un numero veramente alto, quindi spostare il contenuto e tutto il resto nella cella successiva? (Penso di averlo visto da qualche parte, ma questo deve avere problemi di prestazioni no?) – JakeTheBraek

+0

Anche se è più complesso, il principio dovrebbe essere lo stesso, si mescolano i dati di supporto quando la vista della collezione si trova in uno stato di riposo. L'ho fatto con successo su scrollview, tableview e gerarchie di viste di tabelle all'interno di una tabella senza problemi. Se non vuoi fare confusione con i tuoi dati di backup, puoi inserirli in un archivio dati temporaneo e farlo fuori? Ho anche fatto le cose con il numero più alto di celle, ma questo è solo per mantenere l'illusione mentre stiamo scorrendo i dati. Non sarà mai infallibile. – foundry

+0

Grazie per il tuo aiuto. Era, la teoria qui sembra valida e dovrebbe tradurre ok al mio punto di vista. Ho intenzione di provare e duplicare la prima cella dopo l'ultima e viceversa e scattare nelle celle. Una volta terminato il rallentamento, spostare l'utente nella prima cella "reale" o nella "vera" ultima cella in base alla direzione. Tenendo le dita incrociate. – JakeTheBraek

2

Va bene per questo caldo?

Così nel viewDidLoad mio principale del controller della vista che identificano i punti di vista per caricare nelle cellule uicollectionview in un array:

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

Ho anche impostato contare i nostri PageControl a:

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

Ho poi un'istanza di i viewcontrollers nel viewDidLoad del controller della vista principale e impostano l'alpha per la collectionview su 0. Quindi nel nostro scrollViewDidEndDecelerating gestisco il Carousel (passa dall'ultima cella alla prima e alla prima cella per ultima) e aggiorno il pageControl per refle ct il numero di pagina "reale".

- (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; 
    } 
} 

Poi nell'attuazione CollectionView faccio la seguente:

numberOfItemsInSection = vcs.count 

e viewDidAppear per caricare la prima cella (se è la cella a indexPath.row == 1 o 2 o 3 .. . (1 essendo la prima pagina reale non 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; 
    }]; 
} 

penso che dice tutto. il resto delle implementazioni sia per il vc principale e la CollectionView sono di serie. Così ora ho una visione collezione che carica le altre viste e i loro VC che hanno ciascuno la propria animazione o altro. Salvare indexPath.row in NSUserDefaults in modo che la cella in cui mi trovavo quando esco sia la prima cella da mostrare al prossimo caricamento.

speranze che questo aiuta qualcuno, so che ha fatto per me, purtroppo l'uso di librerie 3rd party è stato scoraggiato così ho dovuto costruire questo cattivo ragazzo in su (con l'aiuto di @He Era, grazie ancora!)

+0

Ti piacerebbe la mia versione matrix! Ho usato tabelle e visualizzazioni di tabelle sovrapposte all'interno di TableViews .... – foundry