En el modo de retrato que he cuatro puntos de vista en la parte superior de uno al otro desde la parte superior a la parte inferior de la vista controlador (ver imagen).

XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

Luego quiero cambiar la posición de los puntos de vista relativos a la una de la otra cuando el dispositivo transiciones a la horizontal (ver la imagen de dos).XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

Quiero ver 4 para mover junto vistas 2 y 3, y de todos ellos el sentarse debajo de la vista 1.

Algunas de las condiciones de diseño:

  • ver 1 se adjunta a la parte superior de la vista controlador en tanto paisaje y retrato.
  • 4 de la vista se adjunta a la izquierda, derecha y parte inferior de los márgenes de la vista controlador en el modo de retrato.
  • Vistas 2, 3 & 4 centrado horizontalmente dentro de la vista vertical.

¿Cuál es el mejor método para lograr los diferentes diseños?

Sería la solución más elegante de hacer una referencia a las limitaciones en la vista de los controladores de código y activar y desactivar en viewWillTransition? O hay una manera de utilizar varían de los rasgos para lograr esto (me imagino vistas 2, 3 & 4 centrado horizontalmente, sería difícil de lograr, así como la adición de las nuevas restricciones a las 4 de la vista en el modo de paisaje)?

‘variar dependiendo de los rasgos es la clase de tamaño de XCode 8. Sin embargo, si se agrega una restricción para un determinado tamaño de la clase que se añade a todos ellos. sólo se puede modificar en la actualidad las limitaciones existentes que no ayuda al 4 de la vista de las necesidades de un nuevo conjunto de restricciones.
Creo que el uso de viewWillTransition es probablemente el método preferido, pero no estaba seguro si alguien conoce una forma mejor de hacer esto

OriginalEl autor Fred White | 2017-02-18

2 Comentarios

  1. 19

    Que utilizamos para configurar diferentes conjuntos de restricciones y activar/desactivar basado en cambio de orientación. Pero, hoy en día, el uso de clases de tamaño y «varían de los rasgos».

    Por ejemplo, voy a empezar con una simple vista y elija un ancho reducido tamaño de la clase y, a continuación, elija «Varían de los rasgos»:

    XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

    Yo, a continuación, agregar la correspondiente limitaciones y haga clic en «Hecho diferente»:

    XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

    Yo, a continuación, elija un «regular la anchura del tamaño de clase» y repita el proceso («Varían de los rasgos», agregar las restricciones, haga clic en «Hecho diferente»:

    XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

    Que luego terminan con una escena en la que tendrá un conjunto completamente diferente de las restricciones activas de ancho reducido tamaño de las clases y regular el ancho de clases de tamaño. I. e. cuando ejecuto la aplicación, si el dispositivo se gira, las nuevas restricciones se activan:

    XCode: Cómo cambiar el diseño de puntos de vista entre el paisaje y el modo de retrato

    Para obtener más información, consulte la WWDC 2016 videos en los diseños adaptativos:

    Gracias por la respuesta detallada, por lo que es posible mover los puntos de vista en el variar de los rasgos sin afectar a las otras clases de tamaño (por ejemplo, cambiar a horizontal, mueva el rojo y el azul vistas de lado a lado y, a continuación, agregar restricciones)?
    Sí, cuando se elige una nueva clase de tamaño, mover los puntos de vista que desea, agregar restricciones, y listo. Creo que debe haber algo que me falta en su pregunta: Usted debe haber algún problema con el tamaño de las clases que no estoy entendiendo. Tal vez se puede explicar cuál es el problema que estamos teniendo con el tamaño de la clase de enfoque…
    No utilice el tamaño de las clases para determinar la orientación del dispositivo. El tamaño de la clase («compact» y «regular») y de la orientación del dispositivo («vertical» y «horizontal») no están relacionados. En la actualidad, todos los iPad de tamaño de las clases son «regulares» y no cambian cuando se gira el dispositivo. Con el iphone; en el modo de retrato de algunos de los modelos son «compacto» de ancho y algunos son «regulares» de ancho y así se comportan de forma diferente a la rotación, si usted está confiando en la detección de tamaño de los cambios de clase.

    OriginalEl autor Rob

  2. 1

    Puedo usar matrices de restricciones y activar/desactivar de acuerdo a la orientación.

    var p = [NSLayoutConstraint]()
    var l = [NSLayoutConstraint]()
    var initialOrientation = true
    var isInPortrait = false
    override func viewDidLoad() {
    super.viewDidLoad()
    //add any subviews here
        view.turnOffAutoResizing()        
    //add constraints here....
        //   common constraints you can set their isActive = true
        //   otherwise, add in to portrait(p) and landscape(l) arrays
    }
    override func viewWillLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if initialOrientation {
    initialOrientation = false
    if view.frame.width > view.frame.height {
    isInPortrait = false
    } else {
    isInPortrait = true
    }
    view.setOrientation(p, l)
    } else {
    if view.orientationHasChanged(&isInPortrait) {
    view.setOrientation(p, l)
    }
    }
    }
    extension UIView {
    public func turnOffAutoResizing() {
    self.translatesAutoresizingMaskIntoConstraints = false
    for view in self.subviews as [UIView] {
    view.translatesAutoresizingMaskIntoConstraints = false
    }
    }
    public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool {
    if self.frame.width > self.frame.height {
    if isInPortrait {
    isInPortrait = false
    return true
    }
    } else {
    if !isInPortrait {
    isInPortrait = true
    return true
    }
    }
    return false
    }
    public func setOrientation(_ p:[NSLayoutConstraint], _ l:[NSLayoutConstraint]) {
    NSLayoutConstraint.deactivate(l)
    NSLayoutConstraint.deactivate(p)
    if self.bounds.width > self.bounds.height {
    NSLayoutConstraint.activate(l)
    } else {
    NSLayoutConstraint.activate(p)
    }
    }
    }

    Mis necesidades para distinguir retrato o paisaje requieren el uso de algo distinto tamaño de las clases, como mi aplicación es universal y iPad (a menos que el uso de split o se deslice fuera de la vista) es siempre tamaño normal. También, usted puede conseguir el uso viewWillTransistion(toSize:) o viewDidLoadSubviews() en lugar de ‘viewWillLoadSubviews()` – pero siempre de la prueba, ya que estos pueden ser ejecutadas más de una vez en un cambio de orientación!

    Gracias por la respuesta, lo ideal sería que me gustaría hacerlo a través del guión, pero esta sería una buena alternativa en caso de que esto no puede ser hecho a través del storyboard!
    puede hacerlo a través de storyboards, pero recuerde que el IB es simplemente un «tiempo de diseño» de la herramienta. Lo que significa (me enfrenté a esta) es que las pruebas de un cambio de orientación es tedioso si no imposible, especialmente para el ipad.

    OriginalEl autor dfd

Dejar respuesta

Please enter your comment!
Please enter your name here