with constraint objective-c ios8 autolayout nslayoutconstraint

objective c - constraint - Establecer la clase de tamaño de AutoLayout mediante programación



nslayoutconstraint swift 4 (3)

Es un poco confuso y difícil de encontrar en la documentación porque una "clase de tamaño" no es realmente una "Clase" como NSObject. Están realmente definidos en un enum / typedef llamado: UIUserInterfaceSizeClass

La forma de obtener la clase de tamaño horizontal y vertical para una vista es con una UITraitCollection

Los métodos de clase / tipo para UITraitCollection le permiten crear uno basado en una escala de visualización particular (por ej. Retina o no), de una matriz de otras colecciones de rasgos, con un idioma UI (iPad / iPhone) o opciones horizontales y verticales específicas (compactas , regular), pero para ser sincero, aún no estoy seguro de cómo usarías esto ...

Esta pregunta discute las restricciones de actualización cuando el traitCollection cambia, usando willTransitionToTraitCollection(newCollection: UITraitCollection!, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!)

Tiene razón en que tanto el UITraitCollection como sus propiedades son de solo lectura, pero es evidente que puede crear una nueva colección por algún motivo y gestionar los cambios de diseño cuando cambie la colección de caracteres.

Esta pregunta anterior es bastante similar y enlaza con un artículo de Apple sobre el uso de Adaptive Layout. También consulte el video de WWDC "Creación de aplicaciones adaptables con UIKit".

Con iOS 8 y Xcode 6, en los guiones gráficos ahora tenemos la cuadrícula de tamaño de pantalla que nos permite seleccionar una clase de tamaño. Donde puede seleccionar el formato de diseño para los diferentes tamaños de pantalla.

He encontrado esto extremadamente útil, ya que me permite establecer las restricciones básicas y luego las únicas para cada tamaño de pantalla.

Mi pregunta es, ¿puedes hacer esto programáticamente? Creo mi NSLayoutConstraint forma normal, pero necesito poder especificar diferentes restricciones para diferentes tamaños de pantalla.


Para responder a su pregunta, puede establecer la clase de tamaño mediante programación, sin embargo, es un poco molesto. Debe llamar a "setOverrideTraitCollection" pero desde el controlador de vista principal, no al que realmente deseaba hacer un cambio de rasgo.

En mi situación, quería cambiar el Master VC de un controlador de vista dividida en el iPad para que se viera de forma diferente a la del iPhone, sin embargo, ambos están configurados en Ancho compacto / Altura regular de forma predeterminada. Así que clasifiqué el controlador de navegación del Maestro y agregué el código para establecer los rasgos del Maestro en el ancho Normal cuando no es un iPhone.

Código SWIFT:

class MasterNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() if (self.traitCollection.userInterfaceIdiom != .Phone) { let newTraitCollection = UITraitCollection(horizontalSizeClass: .Regular) self.setOverrideTraitCollection(newTraitCollection, forChildViewController: self.topViewController) } } }

Espero que esto ayude a alguien a buscar una solución similar.


iOS 8 introduce la propiedad active en NSLayoutConstraint . Le permite activar o desactivar una restricción. También hay métodos para activar / desactivar múltiples restricciones.

+ (void)activateConstraints:(NSArray *)constraints + (void)deactivateConstraints:(NSArray *)constraints

  • Mantenga sus restricciones en las matrices al crearlas mediante programación.
  • Cree una matriz para cada uno de los diseños que necesita.
  • Activa / Desactiva cualquier conjunto de restricciones que necesites dentro de willTransitionToTraitCollection