uitableview - bar - uisearchcontroller tableview
Strange UISearchDisplayController ve el comportamiento de desplazamiento en iOS 7 cuando está incrustado en la barra de navegación (8)
Estoy construyendo una aplicación iOS 7 solo. Estoy tratando de establecer un UISearchDisplayController en la barra de navegación.
Lo tengo configurado así: en el guión gráfico, agregué una "barra de búsqueda y controlador de pantalla de búsqueda" a la vista de mi controlador de vista, y lo configuré en (0,0) relativo a la guía de diseño superior. Establecí restricciones para fijar a la izquierda, arriba y a la derecha. (Jugué con las restricciones, las eliminé por completo, no importa) Además de eso tengo mi vista de tabla. Cuando agregué la barra de búsqueda a la vista en el guión gráfico, configuró automáticamente las tomas para searchDisplayController y searchBar delegate. En el código tengo self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
Tengo dos problemas:
1) Sin botones que se muestran para la barra de búsqueda (Constructor de interfaz -> seleccionar barra de búsqueda -> Opciones: ninguna seleccionada) la barra de búsqueda está en el medio de la pantalla:
Si hago clic en la barra de navegación, comienza a editar la barra de búsqueda:
observe también que la superposición oscura parece estar desplazada de la barra de navegación. Me parece que el espacio es de la misma altura que la barra de navegación. Al igual que ha sido desplazado hacia abajo por tanto. Además, cuando muestra los resultados de búsqueda, la parte superior de la vista de contenido se desplaza hacia abajo en la misma cantidad (aparecen más imágenes), lo que me lleva al segundo problema.
2) Estuve jugando con eso por un tiempo y decidí marcar la opción para que muestre el botón cancelar. Ahora tengo la barra de búsqueda incrustada en la barra de navegación correctamente, pero la superposición todavía está desplazada hacia abajo:
De nuevo, cuando aparece la vista de tabla de resultados de búsqueda, se desplaza hacia abajo en la misma cantidad (observe la barra de desplazamiento en el lado derecho):
Aún más extraño, establecí un borde en la capa de vista de tabla del controlador de visualización de búsqueda, y parece correcto:
Nunca he usado UISearchDisplayController antes y no estoy familiarizado con la forma de configurarlo, pero funcionalmente funciona bien. He leído algunas publicaciones similares, pero el único consejo es modificarlas ajustando marcos y configurando compensaciones manuales. Prefiero saber qué está causando esto, ¿es un error? Algo que estoy haciendo mal? Si es un error, puedo esperar una solución. Parece una cosa tan básica que miles de personas deben haber hecho sin ningún problema, así que siento que no estoy configurando correctamente de alguna manera. Gracias por su entrada.
Recuerdo que me encontré con el mismo problema exacto que estás observando. Podría haber un par de soluciones que puedes probar.
Si está utilizando storyboards Debe hacer clic en el controlador de vista o TableView Controller que configuró para su vista de tabla, ir a su inspector de atributos y buscar en la sección ViewController y configurar la sección Extender bordes en Top Bars.
Si no está utilizando guiones gráficos , puede establecer manualmente la configuración con la propiedad viewcontrollers edgesForExtendedLayout, y eso debería ser el truco. Estaba usando guiones gráficos.
En mi caso, al usar guiones gráficos, tuve que marcar tanto las barras inferiores como las inferiores y dejar las barras inferiores sin marcar.
En mi caso, en realidad tuve que quitar la marca de todas las casillas de Extended Edges (esencialmente lo mismo que establecer programáticamente Extended Edges en UIRectEdgeNone
, creo) en mi Storyboard para evitar que mi barra de búsqueda se compense. ¡Gracias chicos!
Desafortunadamente ninguna de las soluciones anteriores funcionó para mí, estoy usando un UITableViewController
.
Este enlace ayudó:
http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/
Puse el código a continuación para mayor comodidad:
static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
if (!view || classNameSuffix.length == 0) return nil;
UIView *theView = nil;
for (__unsafe_unretained UIView *subview in view.subviews) {
if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
return subview;
}else {
if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
}
}
return theView;
}
- (void)correctSearchDisplayFrames {
// Update search bar frame.
CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
superviewFrame.origin.y = 0.f;
self.searchDisplayController.searchBar.superview.frame = superviewFrame;
// Strech dimming view.
UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
if (dimmingView) {
CGRect dimmingFrame = dimmingView.superview.frame;
dimmingFrame.origin.y = self.searchDisplayController.searchBar.frame.size.height;
dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.origin.y;
dimmingView.superview.frame = dimmingFrame;
}
}
- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
[UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
for (UIView *view in self.tableView.subviews) {
if (view != self.searchDisplayController.searchResultsTableView &&
view != self.searchDisplayController.searchBar) {
view.alpha = hidden ? 0.f : 1.f;
}
}
}];
}
// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
if (PSPDFIsUIKitFlatMode()) {
[self.navigationController setNavigationBarHidden:beginSearch animated:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[self correctSearchDisplayFrames];
});
[self setAllViewsExceptSearchHidden:beginSearch animated:YES];
[UIView animateWithDuration:0.25f animations:^{
self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
}];
}
}
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:YES];
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
[self correctSearchDisplayFrames];
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:NO];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
// HACK: iOS 7 requires a cruel workaround to show the search table view.
if (PSPDFIsUIKitFlatMode()) {
controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
}
}
Tuve el mismo problema Y resuelvo este problema añadiendo view object debajo de la tabla vista.
- Agregar nuevo ViewController en el Storyboard
- Arrastre TableView al nuevo VC
- Arrastre la celda de la tabla al TableView
- Haga una conexión para TableView DataSource, TableView Delegate para el nuevo VC
Tuve un comportamiento muy similar sucediendo. Para mí, la solución fue desactivar Extender bordes en la barra superior en la configuración del guión gráfico para el controlador de vista principal (he desactivado las barras de navegación transparentes, no estoy seguro de si eso afecta algo). Si no está utilizando el guión gráfico, debe establecer [UIViewController edgesForExtendedLayout].
De los documentos de Apple:
Esta propiedad solo se aplica para ver controladores integrados en contenedores, como UINavigationController o UITabBarController. Los controladores de vista establecidos como el controlador de vista raíz no reaccionan a esta propiedad. El valor predeterminado es UIRectEdgeAll.
definePresentationContext = true
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
self.tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
Mi problema era solo ajustar las inserciones de la vista de desplazamiento . Después de cambiar a falso , no tuve problema