Implementación de layout automático para vistas generadas programáticamente

Tengo una aplicación cuyas vistas se generan mediante progtwigción. Ejemplo:

-(void)loadView { [super loadView]; // SET TOP LEFT BTN FOR NEXT VIEW UIBarButtonItem *topLeftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordenetworking target:nil action:nil]; self.navigationItem.backBarButtonItem = topLeftBtn; [topLeftBtn release]; // programmatically set up the view for cart tableView CGRect iouTableViewFrame = CGRectMake(0, 0, 320, 348); iouTableView = [[UITableView alloc]initWithFrame:iouTableViewFrame style:UITableViewStylePlain]; [[self iouTableView] setDelegate:self]; [[self iouTableView] setDataSource:self]; [[self view] addSubview:iouTableView]; // set up the summary label CGRect summaryTableFrame = CGRectMake(0, 348, 320, 18); UILabel *summaryTableLabel = [[UILabel alloc] initWithFrame:summaryTableFrame]; [summaryTableLabel setFont:[UIFont fontWithName:@"Helvetica" size:14]]; [summaryTableLabel setText:@" Summary"]; UIColor *labelColor = UIColorFromRGB(MiddleBlueColor); [summaryTableLabel setBackgroundColor:labelColor]; [summaryTableLabel setTextColor:[UIColor whiteColor]]; [[self view] addSubview:summaryTableLabel]; // set up the summary table CGRect summaryTableViewFrame = CGRectMake(0, 366, 320, 44); summaryTableView = [[UITableView alloc]initWithFrame:summaryTableViewFrame style:UITableViewStylePlain]; [summaryTableView setScrollEnabled:NO]; [[self summaryTableView] setDelegate:self]; [[self summaryTableView] setDataSource:self]; [[self view] addSubview:summaryTableView]; } 

Sí. Actualizaré los NIB y utilizaré el generador de interfaces y el guión gráfico en el futuro, pero no hice la progtwigción de ios en un año.

Con el nuevo iPhone 5 con un tamaño de pantalla diferente, la aplicación no se ve bien y necesito implementar un layout automático de algún tipo. ¿Hay alguna forma de hacerlo programáticamente por ahora en lugar de usar IB?

¡Muchas gracias!

Sí, hay, utilizando dos methods en NSLayoutConstraint

 -(NSArray*)constraintsWithVisualFormat:options:metrics:views: -(NSLayoutConstraint*)constraintWithItem:attribute:relatedBy:toItem:attribute: multiplier:constant: 

El lenguaje de formatting visual está empaquetado en un NSString. Por lo tanto, tomaré tu iouTableView, por ejemplo.

 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[iouTableView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(iouTableView)]]; 

El símbolo de la tubería "|" representa el borde de la supervisa. El [] representa una vista. Entonces, lo que hicimos allí fue enganchar el borde izquierdo y derecho de iouTableView al borde izquierdo y derecho de su supervisión.

Otro ejemplo del formatting visual: Conectemos verticalmente la vista de tabla, la label de resumen y la tabla de resumen.

 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: @"V:|[iouTableView(348)][summaryTableLabel(18)][summaryTableView(44)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:NSDictionaryOfVariableBindings(iouTableView, summaryTableLabel, summaryTableView)]]; 

Ahora esto vincula las tres vistas verticalmente en cada uno de sus bordes, NSLayoutFormatAlignAllLeft indica que todas las vistas se alinean a la izquierda y lo harán en function de otras restricciones, en este caso, la restricción anterior. Los () s se utilizan para especificar el tamaño de las vistas.

Hay un poco más como desigualdades y prioridades, así como el símbolo del espaciador "-", pero echa un vistazo a los documentos de Apple para eso

Edit: Se corrigieron los ejemplos para usar constraintsWithVisualFormat como se muestra en la firma del método.

Además de los methods proporcionados por Aplle, puede usar Parus lib para operar con AutoLayout desde el código.

Por ejemplo, podrá especificar:

 PVVFL(@"[view1]-20-[view2]").fromRightToLeft.withViews(views).asArray 

En lugar de

 [NSLayoutConstraint constraintsWithVisualFormat:@"[view1]-20-[view2]" options:NSLayoutFormatDirectionRightToLeft metrics:nil views:views] 

También podrá agrupar configuraciones de layouts, mezclar VFL y no restricciones VFL. Parus es capaz de evitar errores comunes, diferenciar la location y los parameters de las constricciones, y proporciona un gran soporte para completar automáticamente.