2012-08-22 12 views
9

Un NSTableView basado en vistas con filas que tienen alturas dinámicas no cambia el tamaño de sus filas cuando se cambia el tamaño de la vista de tabla. Esto es un problema cuando la altura de la fila se deriva del ancho de la vista de tabla (piense en bloques de texto que llenan una columna y se envuelven extendiendo así el tamaño de la fila).Cambiar el tamaño correctamente de filas en NSTableView basado en vista

que he estado tratando de conseguir NSTableView cambiar el tamaño de sus filas cada vez que cambia de tamaño, pero han experimentado poco éxito:

  • Si cambio el tamaño de las filas visibles sólo mediante la consulta enumerateAvailableRowViewsUsingBlock:, algunas de las filas no visibles no se redimensiona y, por lo tanto, se muestra con la altura anterior cuando el usuario se desplaza y revela estas filas.
  • Si cambio el tamaño de todas las filas que se vuelve notablemente más lento cuando hay una gran cantidad de filas (alrededor de 1 segundo de retraso después de cambiar el tamaño de cada ventana para 1000 filas en mi i7 1,8 GHz MacBook Air).

Cualquiera puede ayudar?

Aquí es donde detecto la vista de tabla cambio de tamaño - en el delegado de la vista de tabla:

- (void)tableViewColumnDidResize:(NSNotification *)aNotification 
{ 
    NSTableView* aTableView = aNotification.object; 
    if (aTableView == self.messagesView) { 
     // coalesce all column resize notifications into one -- calls messagesViewDidResize: below 

     NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self]; 
     [[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle]; 
    } 
} 

Considerando que el siguiente es el manejador de la notificación publicado arriba, donde las filas visibles consiguen cambiar el tamaño:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView; 

    NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new]; 
    [messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) { 
     if (row >= 0) { 
      [visibleIndexes addIndex:row]; 
     } 
    }]; 
    [messagesView noteHeightOfRowsWithIndexesChanged:visibleIndexes]; 
} 

La implementación alternativa que cambia el tamaño de todas las filas se parece a esto:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView;  
    NSIndexSet indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,messagesView.numberOfRows)];  
    [messagesView noteHeightOfRowsWithIndexesChanged:indexes]; 
} 

Nota: Esta pregunta es algo relacionado con View-based NSTableView with rows that have dynamic heights pero está más enfocado a dar respuesta a la vista de tabla de cambio de tamaño.

Respuesta

11

simplemente me fui a través de este problema exacto. Lo que hice fue para supervisar la NSViewBoundsDidChangeNotification de la vista de desplazamiento vista de contenido

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView]; 

y en el controlador, obtener las filas visibles y llamar noteHeightOfRowsWithIndexesChange :. Desactivo la animación mientras se hace esto por lo que el usuario no ve las filas meneo durante el cambio de tamaño como la opinión del entran en la tabla

- (void)scrollViewContentBoundsDidChange:(NSNotification*)notification 
{ 
    NSRange visibleRows = [self.tableView rowsInRect:self.scrollView.contentView.bounds]; 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:0]; 
    [self.tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:visibleRows]]; 
    [NSAnimationContext endGrouping]; 
} 

Esto tiene que realizar rápidamente por lo que los rollos de mesa muy bien, pero su trabajo muy bien para mí.

+0

Para mí, esperó hasta que el usuario han completado el cambio de tamaño a continuación, vuelva a ajustar la altura de las filas. – adib

+1

aparentemente la vista de contenido de la vista de desplazamiento no publica notificaciones de cambio, incluso después de llamar a '[self.scrollView.contentView setPostsBoundsChangedNotifications: YES]' – adib

+1

parece que NSViewFrameDidChangNotification funciona mejor para el cambio de tamaño en vivo –

Cuestiones relacionadas