2008-10-21 16 views
15

Al usar un UITableViewController, el método initWithStyle crea automáticamente el UITableView subyacente con, según la documentación, "las dimensiones correctas".¿Cómo usar un UITableViewController con una tabla pequeña?

Mi problema es que estas "dimensiones correctas" parecen 320x460 (el tamaño de pantalla del iPhone), pero estoy empujando este par TableView/Controller en un UINavigationController que está en sí mismo en una UIView, que es aproximadamente la mitad de altura de la pantalla

No hay disputas de marco o límites que se me ocurran, parece restablecer correctamente el tamaño de la tabla, y como tal es "demasiado larga", lo que significa que hay una colección de filas que se quitan de la parte inferior de la pantalla y no visible ni alcanzable al desplazarse.

Así que mi pregunta se reduce a: ¿cuál es la forma correcta de decirle a UITableViewController que cambie el tamaño de su componente UITableView a un rectángulo específico?

Gracias!

actualización He intentado todas las técnicas sugeridas aquí en vano, pero encontré una cosa interesante: si evito la UINavigationController por completo (que todavía no estoy dispuesto a hacer para la producción, sino como una experimento) y agregue la vista de tabla como directa subvista de la vista adjunta que mencioné, el tamaño de fotograma dado se respeta. El mismo momento Vuelvo a introducir el UINavigationController en la mezcla, sin importar si se agrega como una subvista antes o después de la vista de tabla, y no importa si alloc/init antes o después de que se agregue la vista de tabla como una subvista , el resultado es el mismo que antes.

estoy empezando a sospechar UINavigationController no es mucho de un jugador de equipo ...

Actualización 2 La sugerencia para comprobar tamaño de la trama después de la vista de tabla en la pantalla era una buena: resulta que el controlador de navegación de hecho está redimensionándolo en algún momento entre la carga y la pantalla. Mi solución, hacky en el mejor de los casos, ha sido guardar en caché el marco dado en la carga y restablecerlo si se cambia al comienzo de tableView: cellForRowAtIndexPath :. ¿Por qué lo preguntas? ¡Porque es el único lugar que encontré que funcionó, por eso!

No considero que esto sea una solución, ya que es obviamente incorrecto, pero para el beneficio de cualquier otra persona que lo lea, parece funcionar.

Respuesta

11

¿Por qué no usar simplemente un UIViewController regular y crear la tabla manualmente?

+1

acordado, simplemente extender UIViewController lugar, y añadir una propiedad tableView por su cuenta como esto @property (nonatomic, retain) UITableView \t *tableView; Zennichimaro

1

Acepto la respuesta de Ben. A menudo me he encontrado con la situación en la que necesito cambiar el tamaño de un UITableVIew debido a otros controles en una vista.

Normalmente solo tengo un UIViewController regular con un UITableView IBOutlet. Entonces, si es necesario, puedo manipular el marco del objeto UITableView para que tenga el tamaño que necesito.

+0

Cuidado dar más detalles sobre exactamente cómo se logra esto? – rpj

+1

Simplemente use el UIViewController normal y, por ejemplo, mediante programación, cree TableView - UITableView * mTableView = [[UITableView alloc] initWithFrame: CGRectMake (0,0,320,400)]; mTableView.delegate = self; [[vista propia] addSubview: mTableView]; ¡y ahí lo tienes! :) –

1

No estoy seguro de por qué está creando un controlador de vista adicional para su tabla. Sin embargo, en su código, no veo que agregue la vista de tabla a su padre. También puede intentar reducir la altura de los límites hasta que todo aparezca en la pantalla; Una vez que lo hagas, puede darte una idea de por qué no funciona de la manera que esperas.

+0

Necesito un controlador de vista para poder presionar sobre un UINavigationController, de ahí que esté allí. Como tal, tuve la impresión de que no era necesario agregar la vista de tabla a la vista principal, porque el controlador de vista se encarga de eso por proxy. ¿Me estoy perdiendo de algo? – rpj

+0

¿Está asignando la salida de vista de MyUIViewControllerSubclass a su tabla, o su vista adjunta? –

+0

Como se muestra en el código que publiqué como una "respuesta", definitivamente estoy asignando el punto de vista a la mesa que acabo de crear. – rpj

1

Compruebe las propiedades de autoresizingMask y contentMode de UITableView. Estos pueden afectar el marco.

0

Si está utilizando Interface Builder, puede simplemente ir a la ventana de propiedades "Tamaño de la vista de tabla", y cambiar las Inmovilidades inferiores para Contenido y Scroller con la altura de otro widget.

+0

No ... no para mí. –

3

Tuve el mismo problema y lo resolví cambiando el tamaño de tableView en la función viewDidAppear del UITableViewController. No es la solución ideal, pero funciona.

+0

¡Increíble! Casi ni siquiera intenté esto, pero esto fue lo ÚNICO que pude hacer para tratar de cambiar el tamaño de la vista de tabla de un UITableViewController. Todo lo que hice fue establecer el marco de la vista de tabla en viewDidAppear y funciona perfectamente. ¡Gracias! – user3344977

6

que tenían el mismo problema y lo resolvió con:

-(void) loadView { 
    [self setView:[[[UIView alloc] initWithFrame:CGRectZero] autorelease]]; 
    [[self view] setAutoresizesSubviews:NO]; 

    /* Create & configure table and other views... */ 

    [self setResultsTable:[[RadarTableViewController alloc] initWithNibName:nil bundle:nil]]; 
    [[resultsTable view] setFrame:CGRectMake(0,45,320,200)]; 
} 

Esto se hace en el padre (sólo un UIViewController normal en mi caso) del controlador.

+0

Thx, mi 181 px Tableview dentro de un UIViewController siempre se redujo, ahora está escuchando la configuración de marcos ya que utilizo su [[self view] setAutoresizesSubviews: NO]; – Allisone

+1

Una mejor solución sería modificar la propiedad 'autoresizingMask' de la vista de tabla en su lugar, hacer que cambie su ancho, pero no su altura. – aopsfan

2

puede establecer el margen superior mediante el uso de:

UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0); 
    self.tableView.contentInset = inset; 

que no es una buena práctica, en caso de que desee más espacio en la parte superior que se puede utilizar.

no debe usar UITableViewController, Simplemente Uso UIViewController y programación Crear UITableView

-2

Establecer el marco en UINavigationController.

0

Probar:

self.edgesForExtendedLayout = UIRectEdgeNone; 

//This one in case your NavigationController is not Translucent 
self.extendedLayoutIncludesOpaqueBars = NO; 

Espero que esto ayude.

1

me fijo este problema mediante este código

{ 
    UIEdgeInsets insets; 
    insets.left = 0; 
    insets.right = 0; 
    insets.top = 0; 
    insets.bottom = 60; 
    self.tableView.contentInset = insets; 
    [self.tableView setScrollIndicatorInsets:insets]; 
} 
Cuestiones relacionadas