iphone - source - uitableviewcell swift 3
Forzar mediante programación un UIScrollView para detener el desplazamiento, para compartir una vista de tabla con múltiples fuentes de datos (10)
¿Has intentado usar [view setContentOffset: offset animated: YES]
?
Tengo una UITableView cuya fuente de datos y delegado se cambian entre un par de objetos de origen de datos personalizados cuando el usuario toca un control segmentado (piense en "Pago superior" frente a "Gratis superior" en la aplicación de la tienda de aplicaciones).
Cada objeto de origen de datos guarda su último desplazamiento de contenido de desplazamiento y lo restaura cuando se convierte en el origen de datos activo para la vista de tabla:
tableView.contentOffset = CGPointMake(0, savedScrollPosition);
Esto funciona bien cuando el usuario cambia la fuente de datos cuando la tabla está en reposo, pero si el usuario golpea el control segmentado mientras la tabla aún se está moviendo (es decir, desacelerando), la vista de tabla continúa desacelerándose de la compensación anterior, invalidando asignación contentOffset.
¿Hay alguna manera de forzar que la vista de tabla deje de desplazarse / decelerar cuando configuro contentOffset u otra forma de hacer que este tipo de vista de tabla de fuente de datos intercambiables funcione?
¿Has probado estos 2 métodos?
En realidad, se aplican al "desplazamiento" no solo al desplazamiento del contenido.
[self.tableView scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
O:
[self.tableView scrollRectToVisible:savedFrame animated:NO];
En realidad, deberían afectar el desplazamiento y, por extensión, la aceleración de la tabla, no solo lo que está visible en la pantalla.
Acabo de encontrar esto buscando una forma de detener mi UIScrollView. Necesitaba mover algunas subvistas, pero esta herida no se veía bien si el usuario había movido la pantalla y todavía estaba desacelerando.
De todos modos, scrollRectToVisible
no funcionó para mí (¿quizás porque no estoy usando una vista de tabla?) Pero funcionó perfectamente:
[mainScrollView setContentOffset:CGPointMake(mainScrollView.contentOffset.x, mainScrollView.contentOffset.y) animated:NO];
¡Puedo hacer las cosas de la subvista sin preocuparme!
Esto funcionó bien para mí:
if (self.tableView.isDecelerating) {
NSArray *paths = [self.tableView indexPathsForVisibleRows];
[self.tableView scrollToRowAtIndexPath:[paths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
Fue mi problema cuando tuve un UISwitch como selector para las tablas. Pero con el control segmentado no tengo ningún problema. Tal vez no volviste a cargar la mesa? Este es mi código de trabajo:
NSIndexPath *exPath = [[subTable indexPathsForVisibleRows] lastObject];
isMatchOn = [whatList selectedSegmentIndex] == 0 ? YES : NO; //table source will make the choice looking at this BOOL
[subTable reloadData]; // here tables actually flip
if (lastPosition) {
[subTable scrollToRowAtIndexPath:lastPosition atScrollPosition:UITableViewScrollPositionBottom animated:NO]; //I scroll to saved index
}
self.lastPosition = exPath; //here I save the current position
Podría esperar a que la propiedad ''deceleración'' se convierta en NO (por ejemplo, usando KVO) y cambiar después de eso.
Podrías intentar hacer
tableView.scrollEnabled = NO;
tableView.scrollEnabled = YES;
Esto podría detener el desplazamiento deshabilitándolo, luego permitirlo de nuevo. No he intentado esto específicamente, pero he hecho cosas similares.
También puede hacer self.tableView.isScrollEnabled = true/false
cuando llega a cierto valor de tableView.contentOffset.y
Un trabajo obvio es tener dos vistas de tabla separadas que se intercambian, y cada fuente de datos se adjunta permanentemente a una de las vistas de tabla. Esto me pareció un desperdicio de memoria, pero tal vez estoy pensando demasiado.
Usé el enfoque de Corey. Guardo y restauro las recetas con la representación del diccionario. Además, puede no ser obvio, pero el rect para preservar y restaurar es los límites de UITableView:
// Save the current tableview bounds
CGRect contentRect = self.listTableView.bounds;
if (!!oldScope) [_contentRects setObject:(NSObject *)CGRectCreateDictionaryRepresentation(contentRect) forKey:oldScope];
// Restore if possible
CFDictionaryRef restoredFrameDict = (CFDictionaryRef)[_contentRects objectForKey:newScope];
if (!restoredFrameDict) restoredFrameDict = CGRectCreateDictionaryRepresentation(CGRectZero);
CGRectMakeWithDictionaryRepresentation(restoredFrameDict, &contentRect);
// Switch over to new datasource
self.listTableView.dataSource = [self dataSourceForScope:newScope];
[self.listTableView reloadData];
// Restore content offset for "newScope"; Also stops scrolling
[self.listTableView scrollRectToVisible:contentRect animated:NO];
Tenga en cuenta el uso intercambiable de CFDictionaryRef
y NSDictionary *