2010-03-05 6 views
12

La vista de tabla de mi aplicación no ocupa la altura de la pantalla completa, ya que he permitido 50px en la parte inferior de un banner.iPhone SDK: configuración del tamaño de la vista de tabla de UISearchDisplayController

Cuando empiezo a escribir en la barra de búsqueda, la vista de la tabla de resultados de búsqueda es más grande; llena todo el espacio de pantalla disponible entre la barra de búsqueda y la barra de pestañas. Esto significa que el último resultado de búsqueda está oscurecido por el titular.

¿Cómo especifico el tamaño de la vista de tabla utilizada por UISearchDisplayController? No hay límites ni propiedades de marcos que pueda ver.

Editar para agregar capturas de pantalla:

Ésta es la forma en la vista de tabla se estableció en IB. Termina 50px por debajo de la barra de pestañas sintetizada.

alt text http://iphone.lightwood.net/StackOverflow/gstableviewinib.png

Esto es muestra cómo el contenido con normalidad. Me desplacé hasta el fondo aquí. alt text http://iphone.lightwood.net/StackOverflow/gstableviewatbottom.png

Así es como se muestra durante la búsqueda. Nuevamente, me desplacé hasta el fondo. Si deshabilito el anuncio de banner, puedo ver que la tabla de visualización de búsqueda se extiende hasta la barra de pestañas.

alt text http://iphone.lightwood.net/StackOverflow/gssearchviewatbottom.png

+0

También vale la pena señalar que he probado diferentes alturas de la vista de tabla, y los resultados de la pantalla de búsqueda SIEMPRE se extienden a la parte inferior de la pantalla. El problema no es que la barra de búsqueda en sí sea ~ 50px, empujando todo hacia abajo detrás del banner. –

Respuesta

50

La clave para resolver esto fue averiguar cuándo cambiar la geometría de la vista de tabla. Llamando:

[self.searchDisplayController.searchResultsTableView setFrame:someframe]; 

después de crear el UISearchDisplayController era inútil. La respuesta fue que este método delegado:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { 
    tableView.frame = someframe; 
} 

Nota, también había intentado -searchDisplayController:didLoadSearchResultsTableView pero no sirvió de nada allí. Tienes que esperar hasta que se muestre para cambiar el tamaño.

También tenga en cuenta que si simplemente asigna tableView.frame = otherTableView.frame, la tabla de resultados de búsqueda se superpone con la barra de búsqueda correspondiente, por lo que es imposible borrar o cancelar la búsqueda.

Mi código final era la siguiente:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { 

    CGRect f = self.masterTableView.frame; // The tableView the search replaces 
    CGRect s = self.searchDisplayController.searchBar.frame; 
    CGRect newFrame = CGRectMake(f.origin.x, 
           f.origin.y + s.size.height, 
           f.size.width, 
           f.size.height - s.size.height); 

    tableView.frame = newFrame; 
} 
+0

Gracias por ese amigo. ¡Me estaba volviendo loco! –

+0

¿Cómo declarar el 'someframe'? – user2872856

+0

@ user2872856 'tableView.frame' es un CGRect, por lo que puede hacer:' CGRect someframe = CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height); ' – BigHeadCreations

0

No estoy seguro de entender completamente lo que estás describiendo, sería bueno tener una captura de pantalla.

Parece que lo que sucede es que UITableView es del tamaño de la pantalla y el banner se superpone a los 50 píxeles inferiores. Todos los hijos de UIView tienen un marco, límites y propiedades de centro que heredan de su padre UIView común.

@interface UIView(UIViewGeometry) 

// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead. 
@property(nonatomic) CGRect   frame; 

// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part 
@property(nonatomic) CGRect   bounds;  // default bounds is zero origin, frame size. animatable 
@property(nonatomic) CGPoint   center;  // center is center of frame. animatable 
@property(nonatomic) CGAffineTransform transform; // default is CGAffineTransformIdentity. animatable 
// ... from UIView.h 

se puede manipular estas propiedades a su gusto, parece que sólo hay que ajustar los límites a ser de 50 píxeles más pequeños que la pantalla, y hacer algo de matemáticas para calcular su nuevo centro.

+0

He agregado algunas capturas de pantalla. En ningún momento estoy configurando la geometría para la visualización de la tabla de búsqueda. Si puedo averiguar dónde hacerlo, probablemente sea la respuesta ... pero la propiedad searchResultsTableView de un UISearchDisplayController es de solo lectura. –

+0

La propiedad searchResultsTableView es de solo lectura, pero eso solo significa que no puede cambiar el controlador, debe poder manipular la tabla misma. – slf

+0

http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html – slf

1

He actualizado el código para permitir más profundas vista jerarquías, pero el marco inicial de la vista cubierta semitransparente todavía ocupa toda la ventana debajo de la barra de búsqueda .

-(void)searchDisplayController: (UISearchDisplayController*)controller 
didShowSearchResultsTableView: (UITableView*)tableView 
{ 
    if ([controller.searchBar.superview isKindOfClass: [UITableView class]]) 
    { 
     UITableView* staticTableView = (UITableView*)controller.searchBar.superview; 

     CGRect f = [tableView.superview convertRect: staticTableView.frame fromView: staticTableView.superview]; 
     CGRect s = controller.searchBar.frame; 
     CGRect newFrame = CGRectMake(f.origin.x, 
            f.origin.y + s.size.height, 
            f.size.width, 
            f.size.height - s.size.height); 

     tableView.frame = newFrame; 
    } 
} 
Cuestiones relacionadas