2012-09-04 14 views
5

Estoy intentando implementar paginación para páginas de tamaño personalizado en UITableView. Lo que intento lograr es que la parte superior de la celda activa se alinee con la parte superior de tableView de la tabla , mientras se muestra la parte superior de la siguiente celda en la parte inferior de tableView (para inclinar al usuario a desplazarse y ver más Células).UITableView con comportamiento similar a paginación personalizada

Mis celdas tienen la misma altura.

Si configuro paging=YES, esto da como resultado una ligera compensación que aumenta a medida que hojeo las páginas. Esto se debe a que mi tableView es un poco más alto que una sola celda y la altura de la celda/tamaño de página no se alinea.

He intentado cosas diferentes con la paginación habilitada. Traté de establecer el tamaño de TableView a la altura de la celda, pero luego apagué el recorte y la máscara para que el usuario pudiera ver la siguiente celda. Esto no funciona, ya que la siguiente celda solo se agrega al scrollView subyacente en el último ms antes de que la celda se desplace al cuadro delimitador de tableView.

Luego comencé a implementar los diferentes métodos delegados scrollView para imitar el comportamiento de la búsqueda: parece que no puedo hacerlo bien.

que tengo, entre otras cosas, hemos probado algo como esto:

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

A pesar de que tipo de hace lo correcto, se comporta nada como un ScrollView/tableView con paginación habilitado.

He encontrado algunas publicaciones aquí de personas que intentan lograr lo mismo, pero las respuestas adolecen de la misma "sensación de sorpresa no nativa" que cualquier cosa que intenté hacer.

Gracias por cualquier ayuda dada.

iOS> = 5.0

+0

¿Lo pusiste en funcionamiento? – aqs

+0

@aqs, lo siento, no, nunca funcionó lo suficiente como para posar como paginación. – RickiG

+0

no importa. Tomé este https://github.com/100grams/HGPageScrollView y lo modifiqué para hacerlo desplazarse verticalmente. sirve mi propósito – aqs

Respuesta

3

Si desactiva la paginación puede utilizar la función de UIScrollView delegado:

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

Implementar scrollViewWillEndDragging:withVelocity:targetContentOffset: para volver arriba de coordenadas de la celda más cercana a targetContentOffset, no más cercana a su partida compensar. La solución jjv360 provista lo hace bien, pero es posible que desee ajustarla un poco dependiendo de cuán altas sean sus celdas en promedio (la solución de jjv360 puede ser demasiado rápida en celdas realmente grandes).

me gustaría añadir que se puede hacer desaceleración UITableView 's más rápido a comportarse más como paginado UIScrollView cambiando su propiedad decelerationRate (sólo lo hacen una vez en init/viewDidLoad/donde sea).

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

Gracias Filip, voy a probarlo ahora.Cuando se busca con el comportamiento nativo, no se puede saltar varias páginas, que es, excatly, lo que sucederá si subo el punto final al targetContentOffset, debe ser solo la celda siguiente o anterior. decelerationRate - No he visto eso antes, increíble :) – RickiG

+0

Parece que la deceleración no funciona cuando la búsqueda está habilitada. Gracias por señalar esta API de todos modos :) – Tomasz

1

He resuelto este problema con este código:

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

Gracias a http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html para señalar el camino correcto.

Cuestiones relacionadas