¿Cuándo debo usar Priority in iOS AutoLayout?

Con iOS AutoLayout harás algo como:

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

También puede usar una prioridad para cada restricción de layout.

¿Cuándo debo usar Priority in iOS AutoLayout?

Puedes usarlo para aproximar la lógica condicional.

Por ejemplo, tuve una vista de recorte (imagina un círculo recortado para un perfil de rostro). Si la image era un retrato, quería que el círculo estuviera cerca de la parte superior, pero si la image fuera horizontal, no habría espacio para que estuviera descinput, y no tendría sentido.

Para abordar estos dos casos, primero establezco restricciones límite: la superposition siempre debe estar dentro de la vista de la image (usando <= /> = restricciones en los contantes desde los bordes). Luego tuve otra restricción en una prioridad más baja que decía que idealmente estaría por encima del centro, pero una restricción de reserva por debajo de ese decir que de lo contrario quería que estuviera cinput. Esas dos últimas restricciones causan un conflicto, pero el motor de layout elige la prioridad más alta. En el caso del paisaje, el centro anterior no era posible, por lo que AL rompió eso y quedó con la restricción cinput.

Otro ejemplo, y uno que también está en el siguiente fragment de código, es que quería que mi superposition utilizara el mayor espacio posible, manteniendo la relación de aspecto adecuada. Esto significó que mientras mis restricciones externas eran absolutas, declaré que el marco de recorte ideal era estar en las fronteras, sabiendo que solo un set podía satisfacerse a la vez, pero que la relación de aspecto tiene prioridad. AL luego rompe tantos como sea necesario, que son dos, en cada orientación, dejando a los otros dos en contacto. Sin eso, habría muchas posibles soluciones al problema.

En mi código real, los capturé como una variedad de restricciones. cada uno creado por una variable de instancia perezosa:

  self.addConstraints([ // absolute constraints self.leftMarginConstraint, self.rightMarginConstraint, self.topMarginConstraint, self.bottomMarginConstraint, self.aspectRatioConstraint, self.constrain(self.maskContainer, self, .CenterX, .Equal), // hug the edges as much as possible, but only two of the four will be used self.constrain(self.maskContainer, self, .Left, .Equal, priority:900), self.constrain(self, self.maskContainer, .Right, .Equal, priority:900), self.constrain(self.maskContainer, self, .Top, .Equal, priority:900), self.constrain(self, self.maskContainer, .Bottom, .Equal, priority:900), // try for above center, but accept vertically centenetworking self.constrain(self.maskContainer, self, .CenterY, .Equal, priority:800, multiplier:0.8), self.constrain(self.maskContainer, self, .CenterY, .Equal, priority:500), ]) 

En la reproducción automática, normalmente el uso de prioridad cuando está en conflicto, dos restricciones y el guión gráfico confunden qué restricción es la correcta. si establece la prioridad que utiliza la restricción de prioridad más alta que la segunda.