13

Tengo UISearchBar y UISearchDisplayController, todo funciona bien pero mi selector de ámbito se muestra junto al campo de texto en lugar de debajo. Sé que esta es la acción esperada cuando el dispositivo está en el paisaje, pero ya que tengo la UISearchBar en la vista principal de un UISplitViewController que termina pareciéndose a esto:Barra de alcance de fuerza debajo de UISearchBar

UISearchBar problem

¿Hay alguna manera de forzar la barra de alcance para mostrar debajo del campo de texto en todas las orientaciones de interfaz (sé que esto funciona bien en Mail.app en el iPad, por lo que es posible, pero quién sabe si Apple decidió ocultar la opción para hacerlo)

+0

Encontré una manera de hacerlo, pero no es una API pública. [self.searchDisplayController.searchBar setCombinesLandscapeBars: NO]; Asegúrese de llamarlo en searchDisplayController's searchBar y no en UISearchBar. Aparentemente, el controlador de visualización de búsqueda está administrando esta propiedad. – axiixc

+0

Estoy teniendo el mismo problema y setCombinesLandscapeBars: NO solucionó el problema, pero también el ejemplo de Apple "TableSearch" obtiene los mismos resultados sin usar ese método. ¿Has encontrado otra solución? – nacho4d

+1

En caso de que no sea rechazado, podría utilizar este código, no arroja advertencias y es seguro en caso de que los ingenieros de Apple decidan que el método privado ya no estará disponible. if ([self.searchDisplayController.searchBar responde aSelector: @selector (setCombinesLandscapeBars :)]) { objc_msgSend (self.searchDisplayController.searchBar, @selector (setCombinesLandscapeBars :), NO);} – nacho4d

Respuesta

3

Esto no es parte de la API pública. Esperemos que se agregará en el futuro. Se puede lograr utilizando API Privadas, mirar a través de un volcado de clase UIKit te ayudará allí.

¡Buena suerte!

editar: Tenga en cuenta que el uso de API privadas puede hacer que lo rechacen en la tienda de aplicaciones, como la mayoría de la gente ya sabe.

2

Utilicé el UISearchDisplayDelegate para mostrar y ocultar la barra de alcance.

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    [controller.searchBar setShowsScopeBar:YES]; 
} 

-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller 
{ 
    [controller.searchBar setShowsScopeBar:NO]; 
} 
1

No utilice API privadas. En su lugar, siga la recomendación de Apple de las pautas de interfaz de usuario de IOS:

Cuando hay una barra de búsqueda, puede aparecer una barra de alcance cerca de ella. La barra de alcance se muestra debajo de la barra de búsqueda, independientemente de su orientación, a menos que use un controlador de pantalla de búsqueda en su código (para obtener más información sobre sobre cómo funciona esto, consulte UISearchDisplayController Class Reference). Cuando utiliza un controlador de visualización de búsqueda, la barra de alcance es que se muestra dentro de la barra de búsqueda a la derecha del campo de búsqueda cuando el dispositivo está en orientación horizontal (en orientación vertical, es debajo de la barra de búsqueda).

Esto funcionó para mí usando guiones gráficos.

0

¿Por qué no simplemente configurar su barra de búsqueda programáticamente? Esto es lo que estoy usando en mi proyecto actual. Oculta la barra de búsqueda hasta que el usuario se desplaza hacia arriba y la barra de alcance se carga debajo del campo de texto cuando comienza a escribir elementos. A partir de ahí simplemente filtrar como de costumbre:

- (void)setupSearchBar { 
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; 
self.searchBar.showsScopeBar = YES; 
self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"Users", @"Groups", nil]; 
self.tableView.tableHeaderView = self.searchBar; 

CGPoint offset = CGPointMake(0, self.searchBar.frame.size.height); 
self.tableView.contentOffset = offset; 

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.searchResultsDataSource = self; 
self.searchController.searchResultsDelegate = self; 
self.searchController.delegate = self; 
} 

llamada [self setupSearchBar]; en viewDidLoad que está fuera de las carreras.

Cuestiones relacionadas