Comprender el multiplicador en layout automático para usar el posicionamiento relativo

Estoy tratando de comprender cómo se puede utilizar el layout automático para colocar elementos en relación con otras vistas porcentualmente.

Por ejemplo, recientemente aprendí que puedes especificar que el background de una vista debe estar un 4% más alto que el background de la supervisión al usar esto:

self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.96, constant: 0)) 

Esto tiene sentido para mí porque un multiplicador de 1 lo alinearía justo en el background de la vista, por lo que puedes networkingucir esa cantidad en un 4 por ciento cambiando el multiplicador a 0.96.

Pero, ¿cómo puedes hacer lo mismo en la otra dirección? Desea especificar la parte superior de una label debe comenzar un 4% hacia abajo desde la parte superior de la vista superior. Si usa la misma línea pero cambia los attributes a .Top , eso significa que sería un 4% más alto que la parte superior de la vista superior (pero en realidad no lo mueve fuera de la pantalla). No puedes tener un multiplicador negativo, no creo, y no creo que un valor mayor que 1 haga nada cuando constante es 0. Entonces, ¿cómo logras esa configuration?

Tengo la misma pregunta para implementar primero y después. Trailing es fácil. Si quieres 10% de la derecha:

 self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 0.9, constant: 0)) 

Tiene sentido porque lo vuelve a marcar 0.1 o 10% en lugar de alinearlo por completo en 1.0. ¿Pero cómo haces lo mismo por liderar? Pensé que podría establecer la relación líder de la label con el final de la vista y luego establecer el multiplicador en 0.1. En mi opinión, eso significaría que la label comenzaría en el extremo derecho, pero luego se volvería a marcar 90%, obteniendo así el 10% deseado desde la izquierda. Pero ese no es el caso, no estoy seguro de por qué.

¿Puedes explicar cómo funciona esto, cómo usar correctamente el multiplicador para get estos layouts relativos?

Para hacerlo más fácil, digamos que le gustaría crear una label que tenga el 10% superior e inferior de la altura de la vista superior y el final y el 10% del ancho de la vista superior. En un iPhone en retrato, habrá más relleno por encima y por debajo de la label que por relleno a la izquierda y la derecha del mismo, así (sí, está dibujado a escala):
introduzca la descripción de la imagen aquí

Pero digamos que en el iPad se mostrará en una vista que es un cuadrado perfecto. Por lo tanto, el relleno será la misma cantidad en todo, así:
introduzca la descripción de la imagen aquí

La pregunta es cómo defines estas restricciones para que sean dinámicas en valor, en lugar de establecer un valor fijo para una constante. Ya sé cómo hacer el background y el final, pero la parte superior y el líder me dejan perplejo. Espero entender cómo usar el multiplicador para hacer layouts más avanzados, por ejemplo, especificar que la parte superior de una label debe estar 10% por debajo del background de otra label, en lugar de establecerla en una constante fija.

Hay un par de forms de hacerlo. En el caso más simple, ya casi lo tienes: si quieres que los límites horizontales estén en 10% y 90%, entonces debes especificar ambas restricciones con respecto al borde posterior de la supervisión: Subview.Trailing se cierra a Superview.Trailing con un multiplicador de 0.9 , como usted dice, pero luego Subview.Leading también se cierra a Superview.Trailing , solo con un multiplicador de 0.1 :

introduzca la descripción de la imagen aquí

(y de manera similar para arriba / abajo)

Por otro lado, el caso que mencionas al final es un poco más complicado: "especificar la parte superior de una label debe estar 10% debajo del background de otra label". Para eso, probablemente no podrá usar inserciones de porcentaje fijo como en el caso anterior. En su lugar, puede crear una vista de separador invisible entre ellos: agregue una restricción con Spacer.Height = 0.1 * Superview.Height y luego adjúntela entre las dos tags. (También puede manejar el caso anterior con estas vistas espaciadoras, pero para ese caso no es realmente necesario).

En mi opinión, "No puedes tener un multiplicador negativo que no creo, y no creo que un valor mayor a 1 haga nada cuando constante sea 0", expuso tu desviación comprensiva.

La regla debajo del capó es solo una ecuación lineal:

 FirstItem.Attribute1 = (SecondItem.Attribute2 * Multiplier) + Constant 

Todo medido en puntos. Como puede ver, el multiplicador (una propiedad de NSLayoutConstraint) no es el multiplicador de la constante. Sigue la ecuación, lo que no entiendes será claro.

En cuanto a su ejemplo específico, @Archaeopterasa presentó una gran solución, a continuación se muestra otra:

Basándote en el hecho de que sabes cómo hacer background y detrás, supongo que has hecho estos dos. Luego agrega otras dos restricciones, el efecto será lo que quieras: Establezca el ancho de la etiqueta al 80% del ancho de la vista.Establezca la altura de la etiqueta hasta el 80% de la altura del supervisor.

Por último, si desea especificar el 10% superior de una label debajo del background de otra label, parece que no puede implementarlo sin escribir una línea de código. Debe usar el código para establecer la constante del object NSLayoutConstraint que conecta el FirstItem y el SecondItem después de que se conoce el alto de la supervisión en el time de ejecución.

En primer lugar, arrastre el control de una label a la otra y elija "Espacio vertical". (O puede hacerlo de otras maneras)

En segundo lugar, se necesita una salida de reference:

 @IBOutlet weak var tenPercentOfSuperview: NSLayoutConstraint! 

Luego, haz esto en un lugar apropiado (por ejemplo, en viewDidLoad ())

 let heightOfSuperview = self.view.bounds.height tenPercentOfSuperview.constant = heightOfSuperview * 0.1 

Ahora todo esta bien.

Si desea saber más sobre este tema, se recomienda el documento de Apple: https://developer.apple.com/library/ios/recipes/xcode_help-IB_auto_layout/chapters/EditingConstraintAttributesintheAttributesInspector.html

Aquí esta la

INCREÍBLEMENTE SIMPLE

manera de hacerlo:

introduzca la descripción de la imagen aquí

El ícono de aviso n.º 1 está centrado en el extremo derecho de la vista del asistente "Ver 1/4".

El ícono de aviso # 3 está centrado en el extremo izquierdo de la vista de ayuda "Ver 3/4".

Ya terminaste, ten un Chardonnay.

Convenientemente, en las vistas del ayudante, simplemente configure el multiplicador para cualquier cosa que desee, dependiendo de la sensación que desee. Es increíblemente fácil cambiar esos en su código, usar IBInspectable, animate, y así sucesivamente …

introduzca la descripción de la imagen aquí