Autolayout de iOS: cómo establecer dos distancias diferentes entre vistas, depende de la altura de la pantalla

Sé que me estoy perdiendo algo, porque esto tiene que ser algo fácil de lograr.

Mi problema es que tengo en mi “pantalla de carga” (la que aparece justo después del splash) un UIImageView con dos imágenes diferentes para pantallas de 3.5 “y 4”. En un lugar determinado de esas imágenes, puse un UIActivityIndicator, para decirle al usuario que la aplicación está cargando algo en el fondo. Ese lugar no es el mismo para ambas imágenes, porque una de ellas es obviamente más alta que la otra, así que quiero establecer una restricción de autodiseño que me permita poner ese indicador de actividad en diferentes alturas, depende de si la aplicación se ejecuta en una iPhone 5 o no.

Sin Autolayout, establecería frame.origin.y de la vista en 300 (por ejemplo), y luego en el método viewDidLoad de ViewController, preguntaría si la aplicación se está ejecutando en un iPhone 5, entonces ‘ d cambie el valor a, por ejemplo, 350. No tengo ni idea de cómo hacer esto usando Autolayout y creo que tiene que ser bastante simple.

Puede crear una salida NSLayoutConstraint en su controlador de vista y conectar la toma de stream a la restricción Y del indicador de actividad en su xib o guión gráfico. Luego, agregue un método updateViewContraints a su controlador de vista y actualice la constante de la restricción de acuerdo con el tamaño de la pantalla.

restricción de conexión a la salida

Aquí hay un ejemplo de updateViewConstraints :

 - (void)updateViewConstraints { [super updateViewConstraints]; self.activityIndicatorYConstraint.constant = [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100; } 

Por supuesto, querrá poner sus valores apropiados en lugar de 200 y 100 . Es posible que desee definir algunas constantes con nombre. Además, no olvides llamar a [super updateViewConstraints] .

El problema de la respuesta de @Rob es que debes hacer una gran cantidad de código para cada restricción. Entonces, para resolver eso, simplemente agregue la clase ConstraintLayout a su código y modifique el valor de la constante de restricción para el dispositivo que desee en el IB:

enter image description here

 // // LayoutConstraint.swift // MyConstraintLayout // // Created by Hamza Ghazouani on 19/05/2016. // Copyright © 2016 Hamza Ghazouani. All rights reserved. // import UIKit @IBDesignable class LayoutConstraint: NSLayoutConstraint { @IBInspectable var 📱3¨5_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 480 { constant = 📱3¨5_insh } } } @IBInspectable var 📱4¨0_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 568 { constant = 📱4¨0_insh } } } @IBInspectable var 📱4¨7_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 667 { constant = 📱4¨7_insh } } } @IBInspectable var 📱5¨5_insh: CGFloat = 0 { didSet { if UIScreen.main.bounds.maxY == 736 { constant = 📱5¨5_insh } } } } 

No te olvides de heredar tu restricción de clase de ConstraintLayout . Pronto agregaré la versión objective-c.

La herramienta básica en Diseño automático para administrar la posición de los objetos de la interfaz de usuario es las Restricciones. Una restricción describe una relación geométrica entre dos vistas. Por ejemplo, puede tener una restricción que diga: “El borde derecho de la barra de progreso está conectado al borde izquierdo de una etiqueta con 40 puntos de espacio vacío entre ellos”.

Esto significa que usando AutoLayout no puede hacer ajustes de posición condicionales basados ​​en el modo de UIDevice, sino que puede crear un diseño de vista que se modifica a sí mismo si, por ejemplo. la aplicación se ejecuta en 3.5 ‘pantalla completa (IPhone4) o 4’ pantalla completa (IPhone5) según las restricciones.

Entonces, opciones para su problema usando Restricciones:

1) encuentre una vista en su diseño que pueda usarse para crear una restricción para posicionar la barra de progreso de manera relativa. (seleccione la vista y la barra de progreso usando el botón CMD, luego use el elemento de menú Editor / Pin / Espaciado vertical para crear una restricción vertical entre los 2 objetos)

2) crear una restricción absoluta para pegar la posición de la barra de progreso al borde de la pantalla (manteniendo el espacio) o centralmente

Encontré útil este tutorial sobre AutoLayout que también podría ser beneficioso para ti: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Nota de Pls: el autolayout solo funciona desde iOS 6.

Por lo general, siempre trato de permanecer en Interface Builder para configurar restricciones. Bucear en el código para tener más control suele ser útil si tiene diseños completamente diferentes en iPhone 4 y 6, por ejemplo.

Como se mencionó anteriormente, no puede tener condicionales en Interface Builder, es cuando vincular una restricción a su controlador de vista realmente es útil.

Aquí hay una breve explicación sobre 3 enfoques para resolver problemas de diseño automático para diferentes tamaños de pantalla: http://candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/