Quiero modificar las restricciones de diseño cuando el dispositivo se gira.
Mi UIViewController se compone de 2 UIViews, en el paisaje están alineados horizontalmente,
y en el retrato que están alineados verticalmente.

Funciona en realidad, en willAnimateRotationToInterfaceOrientation, me quite la deseada restricciones y los reemplazó con los demás para tener el derecho de diseño…

Pero hay problemas, durante la rotación de diseño auto empieza a romper las limitaciones antes willAnimateRotationToInterfaceOrientation se llama, entonces, ¿dónde estamos destinados a reemplazar nuestras limitaciones, cuando el dispositivo de reorientación se produce ?

Otro problema es el rendimiento, después de un par de rotaciones que el sistema no se rompe más restricciones, pero tengo una enorme disminución del rendimiento, especialmente en el modo de retrato…

  • por favor agregar aquí el código
  • sí tienes razón, muchos de los problemas surgen cuando se utiliza la auto-presentación, pero me parece muy útil.. de todos modos, parece que será la nueva manera de hacer las cosas, mejor entrar en ella ahora que tarde.
  • Realmente no tengo código para publicar… como dije las limitaciones que se rompen, incluso antes de que mi código es ejecutado, así que realmente no sé cuál es el código podría post!!!
  • Usted debe aceptar una de las respuestas – probablemente de Rob – como él seguro que respondió a su pregunta.
InformationsquelleAutor vitaminwater | 2012-12-06

3 Comentarios

  1. 51

    En willRotateToInterfaceOrientation:duration:, enviar setNeedsUpdateConstraints a cualquier vista de que las necesidades de sus limitaciones modificado.

    También puede hacer una UIView subclase. En la subclase, se registra para recibir UIApplicationWillChangeStatusBarOrientationNotification. Cuando reciba la notificación, envíese setNeedsUpdateConstraints.

    Esto establece la needsUpdateConstraints bandera en la vista. Antes de que el sistema realiza el diseño (mediante el envío de layoutSubviews mensajes), se envía un updateConstraints mensaje a cualquier punto de vista que tiene el needsUpdateConstraints indicador establecido. Aquí es donde usted debe modificar sus limitaciones. Hacer un UIView subclase y reemplazar updateConstraints para actualizar sus limitaciones.

    • Este es muy bueno y funciona a la perfección. En mi implementación estoy iterando sobre [ver restricciones] y la eliminación de cada uno antes de añadir la orientación de las limitaciones específicas. Este es un mayorista de intercambio y de la animación del cambio se ve muy bien.
    • ¿Tienes subclase para cada vista que tendrá sus limitaciones modificado, o se puede de alguna manera hacer que esta completamente desde el punto de vista controlador? Parece que una muy, muy común de la situación sería cambiar algunos de los anchos y alturas para los cambios de rotación, pero sería muy feo si usted tiene que llenar su diseño con múltiples clases personalizadas para muchos vistas interiores.
    • Usted podría hacer una clase personalizada para el nivel superior de la vista y darle salidas a todas las subvistas que necesitan modificado restricciones. A continuación, puede configurar todas las restricciones en que clase personalizada del updateConstraints método.
    • He creado UIView subclase, y Registrado de Notificación, Toma de corriente de mi punto de vista(es decir, ImageView), ahora, cuando la notificación despedido, he setNeedsUpdateConstraints en Que ImageView, y [[auto ImageView] updateConstraints] ajustado en updateConstraints método, pero no pasó nada… Lo que debo hacer.? Una cosa a notar que me he dado restricciones en xib para el Retrato y el Paisaje. Esto está funcionando bien en iOS8, pero no funcionan en iOS7.
    • willRotateToInterfaceOrientation:duration: es obsoleto ahora?
    • Has comprobado la documentación para ver qué es reemplazado con?
    • Fue reemplazado con viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

  2. 13

    Hay muy buena explicación de auto-diseño y rotaciones en Matthijs Hollemans post.
    Usted puede encontrar aquí:
    http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

    Generalmente, se necesitan alrededor de 4 restricciones para posicionar correctamente su punto de vista. Si mis puntos de vista han tamaño constante prefiero pin de altura y anchura. Después de que usted puede utilizar y Líder de la parte Superior de las limitaciones de espacio para hacer lo que quiera. Por ejemplo, puede establecer IBOutlets para el líder y la parte superior de las limitaciones de espacio para sus opiniones:

    @interface ViewController : UIViewController {
        IBOutlet NSLayoutConstraint *_leadingSpaceConstraint;
        IBOutlet NSLayoutConstraint *_topSpaceConstraint;
    }

    De control de arrastre de la toma de corriente para su restricción.
    Ahora usted puede cambiar directamente su punto de vista de la restricción de código:

    _leadingSpaceConstraint.constant = NEW_CONSTRAINT_VALUE;

    Para confirmar los cambios que usted necesita llamar a:

    [self.view layoutIfNeeded];

    Y si quieres hacerlo de animación:

    [UIView animateWithDuration:0.25
                     animations:^{
                         [self.view layoutIfNeeded];
                     }];

    Creo que va a trabajar en willAnimateRotationToInterfaceOrientation, porque no es necesario romper las limitaciones de este enfoque.

    Algunos ejemplo:
    Tiene dos plaza de ver en orientación vertical, una debajo de otra. Conjunto de sus «líderes de espacio para superview» restricciones a 20, por ejemplo. A continuación, establezca «top espacio para superview restricción» a 20 para la primera vista y a 120 para el segundo. Será nuestra configuración por defecto.

    Luego, después de la rotación que usted necesita para volver a calcular sus limitaciones. Ahora el conjunto tanto de la parte superior restricciones a 20, y las principales limitaciones para el 20 y 120, respectivamente. Luego de confirmar los cambios con layoutIfNeeded.

    Espero que ayude.

    • Me siento como usted está derrotando el propósito de autodiseño de allí, si se establece un ancho fijo y altura, y añadir la parte superior izquierda del espacio para el posicionamiento, su no hacer nada más que primavera & struts. por supuesto que no hay borken las restricciones de hacerlo, puesto que no son la adición de ningún tipo de limitaciones en la vinculación de sus puntos de vista en conjunto; por ejemplo, si usted tiene que manejar más de un tamaño de la pantalla/relación, usted tendría que hacer en casos especiales, que es lo que autodiseño tiende a evitar !
    • Yo creo que simplemente es el caso especial. Usted necesita tamaño fijo y dinámico de la posición que usted puede conseguir. Usted necesita dinámica de tamaño – usted puede conseguir. Diseño automático le permite implementar la dinámica de cuando y donde quieras. La primavera & struts – no.
    • Hay algunos casos especiales en los que necesitas mezclar en un par de hard-coded tamaños que reaccionan a las rotaciones. Por ejemplo, en un desplazamiento de la vista que tiene paginación de encendido, de donde se quiere que la vistas interiores a ser la misma que la anchura de la pantalla, de manera que cada línea de la pantalla cuando los llamen a. Que no vale la pena apagado automático para siempre y como no hay una solución como esta. Diseño automático es un gran ahorro de tiempo para el apoyo a todas las resoluciones de dispositivo diferente, y es probable que los dispositivos del futuro se agregará aún más resoluciones de apoyo.
  3. 2

    reemplazar -(void) viewWillLayoutSubviews en su UIViewController para actualizar sus limitaciones como a continuación el código:

    -(void) viewWillLayoutSubviews {
         switch(self.interfaceorientation)
         {
              case UIInterfaceOrientationLandscapeLeft:
    
                  break;
              case UIInterfaceOrientationLandscapeRight:
    
                  break;
    
              case UIDeviceOrientationPortrait:
    
                  break;
    
              case UIDeviceOrientationPortraitUpsideDown:
    
                  break;
    
         }
    }
    • layoutSubviews es una UIView método, no estoy seguro de que es el camino a seguir, pero gracias ! Este proyecto ha sido enviado ahora, así que realmente no puedo probarlo de todos modos, el enfoque más cercano a lo que usted propone sería el uso de la viewWillLayoutSubviews de la UIViewController, creo que había intentado sin éxito..
    • En primer lugar, usted necesita llamar a [super layoutSubviews] si usted está utilizando el diseño automático. En segundo lugar, usted no desea modificar sus restricciones en layoutSubviews, porque layoutSubviews se envía después de el sistema ha resuelto las restricciones. El cambio de las limitaciones que aquí se disparará otra fase de diseño (para resolver los nuevos problemas) en el siguiente turno de la ejecución del bucle.
    • Se ve como el método correcto para implementar/override aquí sería viewWillLayoutSubviews.
    • Esto funciona muy bien. Simplemente establece la nueva restricción constantes y voila! Gracias!

Dejar respuesta

Please enter your comment!
Please enter your name here