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.
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
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
parece que NSViewFrameDidChangNotification funciona mejor para el cambio de tamaño en vivo –