ios - español - constraints xcode
¿Cómo puedo usar un guión gráfico para pantallas de iPhone de 4 "y 3.5" con autolayout(ios6+ios7)? (4)
Si bien hay muchas preguntas y respuestas sobre la creación de un diseño de guión gráfico que funcionaría en tamaños de pantalla de 4 "y 3,5", no pude encontrar una solución adecuada para el siguiente escenario.
Uso autolayout con ios6 (y ios7), y no tengo que admitir landscpae o ipad. Tengo un UIView con varias subvistas, que deben verse como la maqueta a continuación. Es fácil configurar las restricciones de reproducción automática en el guión gráfico para adaptarse a cualquiera de los tamaños de pantalla. Mi pregunta es: ¿cómo puedo hacer que la reproducción automática elija las restricciones correctas en función del tamaño de la pantalla en el tiempo de ejecución?
Tenga en cuenta que NO quiero usar 2 guiones gráficos diferentes. Hacerlo en toda mi aplicación sería mucho trabajo, y tendría que conectar todos los delegados, puntos de venta y acciones en cada storyboard. Un cambio en una pantalla requeriría que hiciera el doble del trabajo.
He intentado 2 métodos para hacer que esto funcione en un guión gráfico, pero no estoy satisfecho con ninguno de ellos.
- Doble las restricciones. La restricción más grande (50) tiene una prioridad más alta que la restricción más baja (30). El problema con este enfoque es que en el tamaño de la pantalla de 3.5 ", el autolayout puede elegir solo unas pocas restricciones de prioridad más bajas, suficientes para satisfacer el diseño, pero dejar algunas restricciones de alta prioridad.
- Subclase NSLayoutConstraint. En este método, todas las restricciones en el guión gráfico están configuradas para ser NSDualLayoutConstraint. En el código de inicialización de NSDualLayoutConstraint, la constante de la restricción se cambia al valor de 3_5_constant en caso de que el tamaño de la pantalla en tiempo de ejecución sea 3.5 ". Este método es más determinista, pero no puede ver el diseño de 3.5" en la vista previa del constructor de interfaces. .
Si solo las restricciones del creador de interfaces tuvieran un valor constante secundario que se aplicaría cuando el tamaño de la pantalla fuera de 3.5 ", resolvería mi problema ... Entonces, sigo con mi pregunta: ¿cómo puedo usar correctamente un solo guión gráfico para diseñar sus subvistas correctamente 4 "Y 3.5" tamaños de pantalla?
¿Qué te parece agregar una vista adicional e incluir la vista cuadrada en su interior? La vista adicional debe ser transparente para que nadie la vea. Establezca las restricciones de la vista adicional para expandirse con el tamaño de la pantalla y establezca las restricciones de la vista cuadrada para que se centren en el cuadro adicional. Seleccione un multiplicador para el tamaño de vista cuadrado en relación con el cuadro adicional
Esta respuesta de ha resuelto el mismo problema para mí.
La clave es hacer un IBOutlet a la restricción (por ejemplo, altura). Entonces haz algo como esto
- (void)updateViewConstraints {
[super updateViewConstraints];
self.myConstraintFromIB.constant =
[UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}
Si desea usar solo un guión gráfico y no desea utilizar el diseño automático, lo que haría su vida mucho más fácil para lo que muestra en su diagrama, tendrá que diseñar sus vistas en código.
Solo deberá detectar si el usuario se está ejecutando en un dispositivo de 4 "y configurar sus vistas en consecuencia.
#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
if (IS_568_SCREEN) {
// Lots of code to layout for 4" devices
} else {
// Lots of code to layout for 3.5" devices
}
Sin embargo, si tuviera que utilizar el autolayout para esto, descubrirá que le ahorrará una tonelada de tiempo y código. En lugar de tener que diseñar manualmente cada vista en código usando la solución que mencioné anteriormente, simplemente necesitaría actualizar las restricciones de altura y altura según el dispositivo.
Teniendo en cuenta este diagrama que muestra lo que el autolayout manejaría por usted y lo que necesitaría actualizar manualmente, esto debería ayudar a obtener una mejor imagen de cuánto ahorrará con el uso del autolayout.
#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
if (IS_568_SCREEN) {
self.layoutConstraintY.constant = 50.0f;
self.layoutConstraintHeight.constant = 248.0f;
} else {
self.layoutConstraintY.constant = 30.0f;
self.layoutConstraintHeight.constant = 220.0f;
}
[self layoutIfNeeded];
Tendrá que editar sus restricciones programáticamente. Puede que encuentre útil esta pregunta para eso.
También puede tener dos archivos de Storyboard separados o dos escenas de viewController en un archivo de storyboard.