Vista de tabla con columnas bloqueadas y desplazamiento horizontal?

Estoy buscando crear una tabla que tenga las siguientes características:

  • Número variable de columnas que se desplazan horizontalmente con el rest de la tabla.
  • Número variable de columnas bloqueadas que no se desplazan horizontalmente con el rest de la tabla
  • Cabeceras de columna seleccionables
  • Se desplaza verticalmente
  • Se desplaza horizontalmente

He visto personas usar diferentes estrategias para lograr una funcionalidad similar, que incluye:

  1. UITableview con cada celda de tabla que contiene una UITableview transformada a 90 grados dentro de otra UIScrollview para manejar el desplazamiento horizontal. Para que esto funcione, sin embargo, tendría que utilizar vistas giradas de tabla bloqueadas para cada celda y parece que habría algo de funkiness con la eliminación de celdas si quería desplazarme por toda la tabla principal en lugar de la tabla dentro de cada celda de la tabla.
  2. Una variación del número uno, pero utilizando una uiview personalizada en lugar de una vista adecuada para cada tablecel. (candidato principal hasta ahora)
  3. Clase UIScrollview personalizada que replica la funcionalidad de una vista UITable con características adicionales como MDSpreadView . Parece el más flexible y el más difícil de implementar.

¿Alguien tiene algún ejemplo / sugerencia / consejo sobre qué search, que será razonablemente fácil de poner en marcha, un gran performance de desplazamiento y flexible.

Todavía estoy en la fase de planificación, tratando de encontrar la mejor forma de hacerlo y de haber dejado algunas ideas hasta ahora, que consta de dos visiones adecuadas con desplazamiento sincronizado. La vista de la tabla izquierda se usaría para las columnas bloqueadas y la tabla derecha se usaría para la tabla de desplazamiento horizontal. Ambas tablas usarían las mismas vistas u tablecelos con objects uiview personalizados para cada columna.

introduzca la descripción de la imagen aquí

ACTUALIZAR

Parece bastante sencillo poder sincronizar el desplazamiento entre las columnas bloqueadas y las tables de desplazamiento horizontal y hasta ahora esta parece ser la opción a la que me estoy inclinando (# 2 arriba). ¿Alguien ve algún obstáculo potencial o lockings con este enfoque?

Un gran ejemplo del producto final deseado que estoy después se puede encontrar en la aplicación Roambi (captura de pantalla a continuación)

introduzca la descripción de la imagen aquí

Gracias

Logré esto con tres vistas, administradas mediante protocolos estándar y un controller de vista única. En esta solución, solo le interesa vincular el desplazamiento vertical de los dos controlleres de vista de tabla. El desplazamiento horizontal se realiza de forma gratuita a través de una vista de desplazamiento que envuelve el cuerpo de la vista de la tabla. Utilizo la siguiente function UITableViewDelegate para get encabezados de columna bloqueados:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; 

introduzca la descripción de la imagen aquí

Ver estructura :

 - View - The VCs root view - Table View - rowHeadersTable - the locked left hand columns - Scroll View - rowBodyHorizontalScrollView - a container of the table body - Table View - rowBodyVerticalContentTableView - the table body, as wide as it needs to be beyond the frame of the parent scroll view 

Controlador de vista :

Protocolos implementados:

 @interface LockedTableColumnsViewController : UIViewController <UITableViewDataSource,UITableViewDelegate> 

Preparar:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self.rowHeadersTable setDataSource:self]; [self.rowHeadersTable setDelegate:self]; [self.rowBodyVerticalContentTableView setDataSource:self]; [self.rowBodyVerticalContentTableView setDelegate:self]; } -(void)viewDidAppear:(BOOL)animated { // This ensures the scroll view can only scroll horizontally, and adapts to the size of its member content [self.rowBodyHorizontalScrollView setContentSize:self.rowBodyVerticalContentTableView.frame.size]; // Important to do this here rather than viewDidLoad, because we want a final reading on self.rowBodyVerticalContentTableView.frame.size [super viewDidAppear:animated]; } // Do your Table Data Source however you choose 

Administre la vinculación de desplazamiento vertical entre rowHeadersTable y rowBodyVerticalContentTableView:

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView == self.rowBodyVerticalContentTableView) { [self.rowHeadersTable setContentOffset:CGPointMake(self.rowHeadersTable.contentOffset.x, scrollView.contentOffset.y)]; } else if (scrollView == self.rowHeadersTable) { [self.rowBodyVerticalContentTableView setContentOffset:CGPointMake(self.rowBodyVerticalContentTableView.contentOffset.x, scrollView.contentOffset.y)]; } } 

NB Esto funcionará muy bien para las tablas largas (es decir, altas) ya que utiliza celdas prototipo, etc. Sin embargo, no optimiza el contenido de fila horizontalmente intenso. El contenido de mi cuerpo de tabla es text y una cantidad finita de columnas. Si no tienes ese lujo, siempre puedes hacer que tu cuerpo de la fila de la table tenga una vista de colección que fluya horizontalmente, pero tendrás que vincular todas las correcciones de la vista de la colección de filas (a través de las celdas visibles, supongo). Eso es todo un animal. ¡Buena suerte!

Si su sistema operativo de destino es anterior a iOS 6.0, podría usar el anuncio de tabla anidada descrito aquí . No olvide sincronizar el desplazamiento de contenido de cada tabla horizontal.

Pero si se orientó a iOS 6.0 o superior , puede usar MMSpreadsheetView , pero su performance es muy malo y no puede establecer diferentes tamaños para sus columnas.

La mejor opción que tienes es escribir tu propio layout de UICollectionView.

Lo he hecho en una de mis propias aplicaciones: echa un vistazo a MDSpreadView . Sus llamadas delegadas / fonts de datos son como UITableView's.