Vista UIViewControllerDidLoad

Tengo un nuevo proyecto y puedo trabajar con la característica de iOS 5+, así que elijo usar las capacidades childControllers AutoLayout y UIViewController.

La pantalla que bash crear es simple: 1. El área superior tiene muchos controles "complejos". 2. El área inferior es una vista de tabla para visualizar los resultados.

Lo que quiero

Quiero que el área de controles tome todo el lugar necesario (es decir, el lugar que di a Interface Builder). El TableView se networkingucirá según sea necesario.

Problema

Cuando se carga desde un XIB, el marco UIViewController.view tiene SIEMPRE un tamaño de 0x568. Me esperaba 0x200 (si 200 era el tamaño que configuré en Interface Builder).

Lo que funciona: con AutoLayout

Creé un XIB con todo mi elemento. Hice la salida en la "vista de raíz" e hice la salida y todos los contenedores de vistas.

Entonces, en mi método viewDidLoad, agregué los contenedores y las restricciones configuradas.

 -(void) setupConstraints { NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1]; // Views dictionary. UIView *topView = self.topView; UIView *table = self.tableTracks; NSDictionary *views = NSDictionaryOfVariableBindings(topView, table); // Views metrics. NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topView.frame.size.height]; NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight); // Pin the topView to the top edge of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]]; // Pin the topView edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]]; // Pin the table edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]]; [self.view addConstraints:constraints]; } 

Con esto, puedo cambiar el tamaño de la vista topView con Interface Builder y cambiar el tamaño de topView según sea necesario (sin resistencia a la compression, no me importa si no podemos ver la tabla).

Qué NO funciona: con ChildControllers y ChildControllers

Entonces, para simplificar, elijo usar ChildControllers (gran cantidad de salida necesaria para realizar la configuration personalizada de UIFont, ¡tan mal que XCode todavía no puede manejarlos!). Hice las siguientes modificaciones:

  1. Se crearon classs HomeTopViewController + XIB. Creado classs HomeTableViewController + XIB.
  2. Copió todas las vistas desde el origen al XIB correcto. Agregue las references de UIViewController + cableado a los puntos de venta.
  3. El contenedor raíz de HomeTopViewController está configurado a una altura de 200px .
  4. Conecté mis contenedores a la salida de view de los controlleres de mi hijo.

Luego actualicé mi código de configuration a lo siguiente:

 -(void) _addChildViewControllersAndSetupConstraints { // Get requinetworking metrics variables NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topViewController.view.frame.size.height]; CFShow(self.topViewController.view); // log is : <UIView: 0xa209c20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xa2097e0>> NSLog(@"self.topViewController.view.frame.size.height = %f", self.topViewController.view.frame.size.height); // Informs controllers the ADD operation started [self addChildViewController:self.topViewController]; [self addChildViewController:self.tableViewController]; // Add view to the view's hierarchy self.topViewController.view.translatesAutoresizingMaskIntoConstraints = NO; self.tableViewController.view.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:self.topViewController.view]; [self.view addSubview:self.tableViewController.view]; // Setup constraints NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1]; // Views dictionary UIView *topView = self.topViewController.view; UIView *table = self.tableViewController.view; NSDictionary *views = NSDictionaryOfVariableBindings(topView, table); // Views metrics dictionary NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight); // Pin the topView to the top edge of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]]; // Pin the topView edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]]; // Pin the table edges to both sides of the container. [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]]; // Adds constraints [self.view addConstraints:constraints]; // Informs controllers the ADD operation ended [self.topViewController didMoveToParentViewController:self]; [self.tableViewController didMoveToParentViewController:self]; } 

Problema

No importa cómo tamaño el contenedor HomeTopViewController en HomeTopViewController la línea CFShow(self.topViewController.view); siempre me dará frame = (0 0; 320 568) cuando esperaba 200px.

Configuré el tamaño de layout en "Freeform" o "Ninguno".

Lo que quiero evitar tanto como sea posible

Odiaría tener que crear otras salidas, luego View en HomeTopViewController y HomeTableViewController y almacenar el frame / height inicial en una propiedad UIViewController.

Preguntas

  1. En el momento de la carga, ¿todas las properties de controller.view.frame son de tamaño en la pantalla? (ya sea de 3,5 o 4 pulgadas)
  2. ¿Cómo puedo resolver esto sin codificar el tamaño en alguna parte // creando salidas adicionales?

Esto sería más fácil si utilizas un storyboard. Puede agregar vistas de contenedor a la vista del controller principal y dimensionarlas como desee, y automáticamente obtiene los controlleres de vista embeddeds en estas vistas de contenedor que están configuradas en el tamaño correcto. Estas vistas de contenedor (junto a la vista UIV normal en la list de objects) solo están disponibles en un storyboard, no en xibs. Esto requerirá casi ningún código, y probablemente no tendrá que agregar ninguna restricción manualmente.