autolayout: crea la altura de la vista en relación con la mitad de la altura de la supervista

han estado entrando en autolagas recientemente y estoy atrapado en lo que parece ser un ejemplo de problema realmente trivial. Tengo la visión de que quiero sentarme en la parte superior de la pantalla y ocupar la mitad de la altura de la pantalla. Simple antes del diseño automático: simplemente vuélvalo a colocar en su lugar y dígale que se expanda verticalmente cuando la supervista se cambie de tamaño.

Ahora, no puedo por mi vida ver cómo hacerlo. Esto es lo que obtengo cuando bash configurar esto:

blues autolayout

La restricción de espacio inferior se establece en “igual a 284”, lo cual es absoluto y absolutamente inútil para mí cuando cambio al diseño de iPhone4, ya que mantiene 284 puntos de espacio en la parte inferior de la pantalla, y reduce la vista para no ser la mitad tamaño de la pantalla Y no hay forma de establecer esa restricción para que sea igual a una fracción de la altura de cualquier otra vista.

Después de luchar por un tiempo, la única forma en que puedo pensar en hacer esto sería introducir otra vista debajo de esta vista, fijar sus alturas por igual, hacer que se sienten arriba y debajo de la otra y luego establecer la segunda vista (inferior) para que sea invisible .. que parece un poco feo!

¿Me estoy perdiendo algo obvio?

Esto ahora es posible en IB a partir de [al menos] Xcode 5.1.1. Aunque me tomó algún tiempo darme cuenta de que en realidad es súper simple:

Primero crea una restricción básica de alineación superior (también deberás configurar las restricciones inferiores, izquierdas y derechas, como normalmente). A continuación, seleccione la restricción y navegue hasta el inspector de atributos :

Demostración de los pasos anteriores

Entonces puedes ajustar el multiplicador. Si lo quiere, el 50% de la supervista lo deja en 1 , ya que está alineado por el centro del súper. Esta también es una gran manera de crear vistas que también tienen otros porcentajes (como el 25% de la supervista)

Demostración del segundo paso anterior

Solución Storyboard donde puede establecer la proporción exacta entre cualquier punto de vista:

Establecer la restricción de igualdad de altura

Ahora:

Edite el multiplicador de la restricción

¡¡¡LUCRO!!!

Resultado

PS También tenga en cuenta que este método funciona con vistas en diferentes niveles de anidación y (obviamente) aplicable para el ancho

PPS a veces puede ser útil “invertir el primer y el segundo elemento” de la restricción o configurar el multiplicador inverso (por ejemplo 2 en lugar de 0.5) (pero estos métodos no son útiles si no entiende cómo se relacionan las vistas entre sí).

Después de un poco más de tiempo, he encontrado lo siguiente.

Lo estoy señalando como una respuesta, pero no es muy satisfactorio, ya que supone que no se puede hacer esto en Interface Builder, pero la restricción correcta se puede agregar en el código posteriormente como:

 - (void) viewWillAppear:(BOOL)animated { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview attribute:NSLayoutAttributeHeight relatedBy:0 toItem:self.view attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; [self.view addConstraint:constraint]; } 

Básicamente, establece un multiplicador de 0.5 contra la altura de self.view, actuando en upperview. Tuve que establecer la prioridad de la restricción de espacio vertical inferior en IB a menos de 1000 para evitar un montón de mensajes de tiempo de ejecución sobre las restricciones de interrupción también.

Entonces, si alguien puede mostrar cómo hacer esto en Interface Builder, sería mejor responder a mi pregunta, de lo contrario, supongo que esto es tan bueno como se puede esperar (por ahora) ???

También tengo otra posibilidad en el código en caso de que tenga 2 vistas que deberían tener la misma altura: simplemente ajuste la altura de view2 a la altura de view1 (el truco aquí no es establecer el alto de view1 explícitamente).

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]" options:0 metrics:nil views:viewsDict]]; 

Ligeramente más fácil y más directo que el método que la respuesta de Fyodor Volchyok. – Mantenga presionado el botón de control y haga clic en la subvista. -Sigue presionando el botón de comando, arrastre el cursor a la supervista y luego haga clic en la supervista. -Seleccione “Relación de aspecto”.

enter image description here

– Luego haga clic en el Inspector de tamaño. -Entonces haz doble clic en la restricción. enter image description here

-Asegúrese de que se selecciona “altura” para ambos elementos. enter image description here

-Entonces cambie el “Multiplicador” a 0.5 para la mitad de la pantalla, o la fracción de la supervista que desee. enter image description here

Swift versión de la respuesta de Mete:

  override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. upperView.translatesAutoresizingMaskIntoConstraints = false var constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 0.5, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0) self.view.addConstraint(constraint) }