2012-09-04 13 views
5

Sto cercando di implementare il paging per pagine di dimensioni personalizzate in UITableView. Quello che sto cercando di ottenere è che la parte superiore della cella attiva sia allineata con la parte superiore della tabellaView, mentre si mostra ancora la parte superiore della cella successiva nella parte inferiore della tabellaView (per inclinare l'utente per scorrere e vedere altro celle).UITableView con comportamento di tipo paging personalizzato

Le mie celle sono tutte di uguale altezza.

Se si imposta paging=YES, questo risulta in un leggero spostamento che aumenta mentre sfoglia le pagine. Ciò è dovuto al fatto che il mio TableView è leggermente più alto di una singola cella e che l'altezza della cella/dimensione della pagina non si allinea.

Ho provato diverse cose con il paging abilitato. Ho provato a impostare la dimensione del TableView all'altezza della cella, ma poi a disattivare il ritaglio e il mascheramento in modo che l'utente potesse ancora vedere la cella successiva. Questo non funziona in quanto la cella successiva viene aggiunta alla scrollView sottostante solo all'ultimo ms prima che la cella scorra nel riquadro di delimitazione di tableView.

Ho quindi iniziato a implementare i diversi metodi del delegato scrollView per simulare il comportamento del paging: non riesco a farlo bene.

ho, tra le altre cose, provato qualcosa di simile:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

Mentre sorta di fa la cosa giusta, si comporta niente come uno ScrollView/tableView con paginazione abilitato.

Ho trovato alcuni post qui da persone che cercano di ottenere la stessa cosa, ma le risposte risentono dello stesso "scatto non nativo" che qualsiasi cosa ho provato io stesso fa.

Grazie per l'aiuto fornito.

iOS> = 5,0

+0

hai funzionato? – aqs

+0

@aqs sorry no, non ha mai funzionato abbastanza bene da posare come impaginazione. – RickiG

+0

non importa. Ho preso questo https://github.com/100grams/HGPageScrollView e modificato per farlo scorrere verticalmente. serve il mio scopo – aqs

risposta

3

Se si spegne il paging è possibile utilizzare la funzione di UIScrollView delegato:

-(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

Implementare scrollViewWillEndDragging:withVelocity:targetContentOffset: per tornare in alto di coordinate della cella più vicina al targetContentOffset, non è più vicino alla vostra partenza compensare. La soluzione fornita da jjv360 funziona bene, ma potrebbe essere necessario modificarla un po 'a seconda di quanto le celle sono in media (la soluzione di jjv360 potrebbe essere troppo scattante su celle molto grandi).

Vorrei solo aggiungere che si può fare di decelerazione UITableView s' più veloce a comportarsi più come paging UIScrollView modificando la sua proprietà decelerationRate (basta farlo una volta in init/viewDidLoad/ovunque).

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

Grazie Filip, ci provo solo ora.Quando si esegue il paging con il comportamento nativo, non è possibile saltare più pagine, il che è esattamente ciò che accadrà se morsetto l'endpoint su targetContentOffset: deve essere solo la cella successiva o precedente. decelerationRate - Non l'ho mai visto prima, fantastico :) – RickiG

+0

Sembra che il decelerationRate non funzioni quando il paging è abilitato. Grazie comunque per aver segnalato questa API :) – Tomasz

1

ho risolto questo problema con questo codice:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

-(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { 

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

Grazie a http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html per indicare la strada giusta.

Problemi correlati