Las dos vistas de iOS cubren exactamente la mitad de la vista principal.

En mi aplicación, quiero lograr este layout:

introduzca la descripción de la imagen aquí

Entonces, la vista principal contiene dos sub vistas. El primero termina exactamente en el medio (altura / 2) y el segundo comienza en la mitad de la vista principal. Descubrí que es imposible hacer eso en el IB con limitaciones. Entonces usé este código en el método viewDidLoad :

 NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:firstView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]; [self.view addConstraint:constraint]; 

Ahora funciona, pero solo si la aplicación se ejecuta en el iPhone. Porque el tamaño de la vista es como la pantalla del iPhone. Si esta aplicación se ejecuta en el iPad, hay un problema porque la pantalla tiene un tamaño diferente, por lo que esta vista principal es más larga. Y la restricción (el código anterior) todavía toma un tamaño de 0.5 * del tamaño de las vistas del IB y no del tamaño del tamaño de la vista del iPad. Item toItem:self.view aún toma el tamaño del IB.

El resultado es que esta vista tiene el mismo tamaño en el iPad que en el iPhone. En el iPad hay un gran espacio en blanco y luego hay una vista con tamaño de iPhone.

¿Puedes decir qué tengo que hacer para que sea universal para varios tamaños de pantalla? Muchas gracias

Esto es posible usando restricciones, pero IB hace un poco complicado un administrador de restricciones bastante molesto e inflexible. Así es como lo logré:

  • En IB, establece las dos vistas con los cuadros correctos
  • Agregue una restricción de altura igual entre las dos vistas.
  • Reduzca la prioridad de cualquier restricción de altura pnetworkingeterminada en cualquiera de las vistas. Desafortunadamente, IB no le permite eliminar estos por completo, pero establecerlos en cualquier cantidad menor a 1000 se asegurará de que se ignoren.
  • En el control view viewDidLoad, agregue la restricción que ya probó.

p.ej

 - (void)viewDidLoad { [super viewDidLoad]; NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.topView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]; [self.view addConstraint:constraint]; } 

Eso es. Screengrabs de las restricciones IB se muestran a continuación:

Restricciones de vista superiorRestricciones de vista inferior

Prueba este codigo Establecerá el valor de la restricción dinámicamente

En su file .h, implemente estas líneas.

  #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) @property (weak, nonatomic) IBOutlet NSLayoutConstraint *TopsubviewheightConstraint; 

Ahora crea esta restricción según la captura de pantalla dada

para Iphone

para ipad

conecte la restricción de altura TopsubviewheightConstraint desde la pantalla

para Iphone

para ipad

implementar este código en el file .m

 if (IS_IPHONE_5) _TopSuperViewConstraint.constant = 275; else if(IS_IPAD) _TopSuperViewConstraint.constant = 502; else _TopSuperViewConstraint.constant = 230; 

Espero que te ayude.

OK, así que me di count de cómo hacerlo. Simplemente coloque el código en el método viewDidLayoutSubviews y no para viewDidLoad . La solución que encontré en el tema No se pudo establecer el marco correctamente antes de viewDidAppear .

Aquí está mi código:

 [subView1 setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2)]; [subView2 setFrame:CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2)]; 

Gracias a todos por el esfuerzo!

tienes 2 opciones

  1. crear un segundo file IB para iPad
  2. haga todo por progtwig y use [[UIScreen mainScreen] bound]; en lugar de get los tamaños de padre;)

Lo haría sin las restricciones en absoluto y estableceré lo siguiente:

 // self.view is my container view CGRect frame = [[UIScreen mainScreen] bound]; frame.size.height /= 2; // upper View upperView.frame = frame; // lower View frame.origin.y = frame.size.height; // or alternatively //frame.origin.y = CGRectGetMaxY(frame); lowerView.frame = frame; 

aquí no necesita ninguna opción específica del dispositivo, todo es dynamic, está vinculado al tamaño de la pantalla de su dispositivo;)

Gracias a la respuesta de Tark, también logré usar restricciones:

  1. Agregar restricción Espacio vertical para TobView a la Top Layout Guide (usando StoryBoard)
  2. Agregar restricción de espacio vertical para BottomView a la Bottom Layout Guide (usando StoryBoard)
  3. Agregue dos restricciones de altura para cada vista en ViewDidLoad

Código:

 NSLayoutConstraint *constraint; constraint = [NSLayoutConstraint constraintWithItem:_viewTop attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]; [self.view addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:_viewBottom attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]; [self.view addConstraint:constraint];