UITableView no se desplaza después de contenidoInset

Estoy trabajando en un proyecto donde tengo un tableview y un uitextfield.

Estoy aplicando el siguiente método cuando el campo uitextfield gana / pierde el foco:

-(void)enableInset { CGFloat offSet = -30.0f; UIEdgeInsets inset = UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 00.f); // Updating the tableView position. placesTableView.contentInset = inset; placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet)); placesTableView.scrollIndicatorInsets = inset; } 

y

 - (void)disableInset { CGFloat offset = self.navigationController.navigationBar.frame.size.height + [UIApplication shanetworkingApplication].statusBarFrame.size.height; UIEdgeInsets inset = UIEdgeInsetsMake(offset, 0.0f, 0.0f, 00.f); placesTableView.contentInset = inset; placesTableView.contentOffset = CGPointMake(0.0f, -offset); placesTableView.scrollIndicatorInsets = inset; } 

El método enableInset se invoca en viewDidLayoutSubviews. entonces cuando invoco disableInset y enableInset, UITableView ya no se puede desplazar.

¿Qué hice mal? ¿Alguna idea de dónde puedo search alguna respuesta?

EDIT: Si puede ayudar, agregué el proyecto en github:

https://github.com/Loadex/PlaceViewer

Para volver a producir el error: Desplácese por la list, toque en la barra de búsqueda, presione cancelar, intente volver a desplazarse por la list.

Extrañamente, click el button de filter, cuando se descarta la UIActionSheet, el desplazamiento vuelve a funcionar.

Mientras buscaba una solución a su problema, me di count de que la parte inferior del contenido de su placeTableView cambió a través de los diferentes estados. Era 0 cuando estaba en el estado inicial donde se podía ver el map, y el tableView se comportaba como se esperaba. Se estableció en 216 cuando el keyboard salió después de tocar el campo de búsqueda. Me di count de que se trataba de una comunicación automatizada entre el tableView y el keyboard (a través de notifications o algo que hiciste en PlacesQueryTableViewController). Esto está bien porque queremos que el recuadro inferior se configure en la parte superior del keyboard cuando aparezca. Ahora viene la parte del buggy. Cuando toqué el button cancelar, el contenido de Integrar.bajo se estableció en -216.

No puedo explicar por qué sucede esto, pero sospecho que tiene algo que ver con cómo se implementa ese cambio automático del recuadro. Sospecho que hace algo así como tableView.contentInset.bottom -= heightOfKeyboard , y eso probablemente suceda cuando la animation haya finalizado, y no antes. El origen de su problema es que usted cambia esa parte inferior de ContentInset antes de que se complete la animation y, por lo tanto, antes de que ocurra el cambio automático. Entonces, está configurando la parte inferior a 0 tan pronto como el usuario pulsa cancelar. Luego, el sistema entra y lo networkinguce a la altura del keyboard, que resulta ser 216. Eso es lo que creo que está sucediendo de todos modos.

Para solucionar este problema, evite cambiar la parte inferior de ContentInset y simplemente cambie la parte superior. placesTableView.contentInset.top es readOnly, pero si lo hace como en el siguiente código, puede solucionarlo. Acabo de cambiar dos líneas de código en cada método, las que tienen que ver con el recuadro. Espero que veas lo que hice.

 -(void)enableInset { NSLog(@"Enabling insets"); // Setting the tableView to overlay the map view CGFloat offSet = [placestableViewController tableView:placestableViewController.tableView heightForRowAtIndexPath:nil] - 30.0f; UIEdgeInsets inset = placesTableView.contentInset; // UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 0.0f); inset.top = placesMapView.frame.size.height - offSet; // Updating the tableView position. placesTableView.contentInset = inset; placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet)); placesTableView.scrollIndicatorInsets = inset; placesMapView.hidden = NO; [placestableViewController loadObjects];} - (void)disableInset { NSLog(@"Disable insets"); CGFloat offset = self.navigationController.navigationBar.frame.size.height + [UIApplication shanetworkingApplication].statusBarFrame.size.height; UIEdgeInsets inset = placesTableView.contentInset;// UIEdgeInsetsMake(offset, 0.0f, 0.0f, 0.0f); inset.top = offset; placesTableView.contentInset = inset; placesTableView.contentOffset = CGPointMake(0.0f, -offset); placesTableView.scrollIndicatorInsets = inset; // Hidding the map while in search placesMapView.hidden = YES;} 

.

BTW, si quieres saber cómo encontré los valores contentInset en los diferentes estados, es bastante simple. Lo que hice fue establecerme como el delegado de placesTableView en - (void)viewDidLoad como este placesTableView.delegate = self; . También tuve que cambiar la instrucción @interface a @interface KrackMapViewController () <UITableViewDelegate> para decir que cumplimos con el UITableViewDelegate. Ahora, este es el truco: UITableViewDelegate se ajusta a UIScrollViewDelegate. Eso significa que podemos implementar methods del delegado de vista de desplazamiento. El que es particularmente interesante es este:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { NSLog(@"Did scroll with insetTop: %f, insetBottom: %f, contentOffset: %f", placesTableView.contentInset.top, placesTableView.contentInset.bottom, placesTableView.contentOffset.y); }

Eso nos permite saber cuándo comienza a arrastrar la tablaView, y simplemente ingrese los diferentes parameters.

Espero que esto haya sido útil. Hazme saber si esto funciona para ti.

Después de algunas investigaciones aquí es lo que noté:

La tabla de visualización cuando se suelta el keyboard no se desplaza porque la vista de tabla parece creer que se muestra en toda la pantalla. Intenté agregar más datos en la vista de tabla y podemos ver que la vista se desplaza un poco.

Lo que creo que sucedió es que cuando el keyboard está oculto, algunas llamadas automáticas se realizan y ensucian con lo que establezco en mi método enableInset. Aquí está mi solución de trabajo:

Me registré para el evento hideKeyboard:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; 

y en la callback llamé a enableInset:

 - (void)keyboardDidHide: (NSNotification *) notif{ [self enableInset]; } 

Y la vista vuelve a desplazarse. Cualquier explicación sobre esto es bienvenida.