Área segura de Xcode 9

150

Mientras explora el área segura encontrada de Xcode9 Beta en los constructores de interfaces Vea el visor de jerarquía Sentí curiosidad y traté de saber sobre la documentación del Área segura en las manzanas, en esencia el documento dice "El área de vista que interactúa directamente con el diseño automático" Pero no me satisfizo, quiero saber Uso práctico de esta nueva cosa.

¿Alguien tiene alguna pista?

ingrese la descripción de la imagen aquí

Párrafo de conclusión del documento de Apple para el área segura.

La clase UILayoutGuide está diseñada para realizar todas las tareas previamente realizadas por vistas ficticias, pero para hacerlo de una manera más segura y eficiente. Las guías de diseño no definen una nueva vista. No participan en la jerarquía de vistas. En cambio, simplemente definen una región rectangular en el sistema de coordenadas de su vista propietaria que puede interactuar con el diseño automático.

inmersión
fuente
1
Puedes ver la sesión de WWDC. Todo se explica allí. No estoy seguro del nombre. Algo con Xcode o InterfaceBuilder en su nombre.
Maik639

Respuestas:

282

Área segura es una guía de diseño ( Guía de diseño de área segura ) .
La guía de diseño que representa la parte de su vista que no está oculta por barras y otro contenido. En iOS 11+, Apple está eliminando las guías de diseño superior e inferior y las reemplaza con una sola guía de diseño de área segura.

Cuando la vista es visible en pantalla, esta guía refleja la parte de la vista que no está cubierta por otro contenido. El área segura de una vista refleja el área cubierta por barras de navegación, barras de pestañas, barras de herramientas y otros antepasados ​​que oscurecen la vista de un controlador de vista. (En tvOS, el área segura incorpora el bisel de la pantalla, según lo define la overscanCompensationInsetspropiedad de UIScreen.) También cubre cualquier espacio adicional definido por la additionalSafeAreaInsetspropiedad del controlador de vista . Si la vista no está instalada actualmente en una jerarquía de vistas o aún no está visible en la pantalla, la guía de diseño siempre coincide con los bordes de la vista.

Para la vista raíz del controlador de vista, el área segura en esta propiedad representa la porción completa del contenido del controlador de vista que está oculto, y cualquier inserción adicional que haya especificado. Para otras vistas en la jerarquía de vistas, el área segura refleja solo la parte de esa vista que está oculta. Por ejemplo, si una vista está completamente dentro del área segura de la vista raíz del controlador de vista, las inserciones de borde en esta propiedad son 0.

Según Apple, Xcode 9 - Release Note
Interface Builder utiliza UIView.safeAreaLayoutGuide como reemplazo de las guías de diseño superior e inferior en desuso en UIViewController. Para usar la nueva área segura, seleccione Guías de diseño de área segura en el inspector de archivos para el controlador de vista y luego agregue restricciones entre su contenido y los nuevos anclajes de área segura. Esto evita que su contenido sea oscurecido por las barras superior e inferior, y por la región overscan en tvOS. Las restricciones al área segura se convierten en Superior e Inferior cuando se implementa en versiones anteriores de iOS.

ingrese la descripción de la imagen aquí


Aquí hay una referencia simple como una comparación (para lograr un efecto visual similar) entre la Guía de diseño existente (superior e inferior) y la Guía de diseño de área segura.

Diseño de área segura: ingrese la descripción de la imagen aquí

Diseño automático

ingrese la descripción de la imagen aquí


¿Cómo trabajar con el diseño de área segura?

Siga estos pasos para encontrar la solución:

  • Habilite 'Diseño de área segura', si no está habilitado.
  • Elimine 'toda restricción' si muestran conexión con Super view y vuelva a conectar todo con un anclaje de diseño seguro. O bien Haga doble clic en una restricción y edite la conexión desde la supervista al anclaje SafeArea

Aquí hay una instantánea de muestra, cómo habilitar el diseño de área segura y la restricción de edición.

ingrese la descripción de la imagen aquí

Aquí está el resultado de los cambios anteriores

ingrese la descripción de la imagen aquí


Diseño de diseño con SafeArea
Al diseñar para iPhone X, debe asegurarse de que los diseños llenen la pantalla y no estén ocultos por las esquinas redondeadas del dispositivo, la carcasa del sensor o el indicador para acceder a la pantalla de inicio.

ingrese la descripción de la imagen aquí

La mayoría de las aplicaciones que utilizan elementos de interfaz de usuario estándar proporcionados por el sistema, como barras de navegación, tablas y colecciones, se adaptan automáticamente al nuevo factor de forma del dispositivo. Los materiales de fondo se extienden hasta los bordes de la pantalla y los elementos de la interfaz de usuario se insertan y colocan adecuadamente.

ingrese la descripción de la imagen aquí

Para aplicaciones con diseños personalizados, la compatibilidad con iPhone X también debería ser relativamente fácil, especialmente si su aplicación usa Diseño automático y se adhiere a las guías de diseño de márgenes y áreas seguras.

ingrese la descripción de la imagen aquí


Aquí hay un código de muestra (Ref. De: Guía de diseño de área segura ) :
Si crea sus restricciones en el código, use la propiedad safeAreaLayoutGuide de UIView para obtener los anclajes de diseño relevantes. Recreemos el ejemplo anterior de Interface Builder en código para ver cómo se ve:

Suponiendo que tenemos la vista verde como una propiedad en nuestro controlador de vista:

private let greenView = UIView()

Podríamos tener una función para configurar las vistas y restricciones llamadas desde viewDidLoad:

private func setupView() {
  greenView.translatesAutoresizingMaskIntoConstraints = false
  greenView.backgroundColor = .green
  view.addSubview(greenView)
}

Cree las restricciones de margen inicial y final como siempre utilizando el layoutMarginsGuide de la vista raíz:

 let margins = view.layoutMarginsGuide
    NSLayoutConstraint.activate([
      greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
      greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
 ])

Ahora, a menos que solo tenga como objetivo iOS 11, deberá ajustar las restricciones de la guía de diseño del área segura con #available y volver a las guías de diseño superior e inferior para las versiones anteriores de iOS:

if #available(iOS 11, *) {
  let guide = view.safeAreaLayoutGuide
  NSLayoutConstraint.activate([
   greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
   guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
   ])

} else {
   let standardSpacing: CGFloat = 8.0
   NSLayoutConstraint.activate([
   greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
   bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
   ])
}


Resultado:

ingrese la descripción de la imagen aquí


Después de la UIViewextensión, le facilitará trabajar con SafeAreaLayout mediante programación.

extension UIView {

  // Top Anchor
  var safeAreaTopAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.topAnchor
    } else {
      return self.topAnchor
    }
  }

  // Bottom Anchor
  var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.bottomAnchor
    } else {
      return self.bottomAnchor
    }
  }

  // Left Anchor
  var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.leftAnchor
    } else {
      return self.leftAnchor
    }
  }

  // Right Anchor
  var safeAreaRightAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.rightAnchor
    } else {
      return self.rightAnchor
    }
  }

}

Aquí hay un código de muestra en Objective-C :


Aquí está la documentación oficial del desarrollador de Apple para la guía de diseño de área segura


Se requiere un área segura para manejar el diseño de la interfaz de usuario para iPhone-X. Aquí hay una guía básica sobre cómo diseñar una interfaz de usuario para iPhone-X usando el diseño de área segura

Krunal
fuente
En cuanto a la diferencia entre marginsy view.leadingAnchor: cuando usa let margins = view.layoutMarginsGuidey usa más tarde margins.leadingAnchor, está restringiendo la vista a los márgenes de la vista. Esto agregará algo de espacio extra a los lados. Si no desea que sólo tiene que utilizar view.leadingAnchory view.trailingAnchory no verá ningún espacio en blanco a la izquierda oa la derecha ...
Honey
"El área segura de una vista refleja el área cubierta por barras de navegación, barras de pestañas, barras de herramientas y otros antepasados ​​que oscurecen la vista de un controlador de vista" ¿No quiere decir que no está cubierto? El documento dice "sin obstáculos por barras y otro contenido".
Miel
He visto un comportamiento extraño en Xcode 10.1 donde el área segura no se extendería hasta la parte inferior de la pantalla en una vista de pantalla completa. Creo que lo causé arrastrando accidentalmente una 'Barra de pestañas' hacia abajo y luego eliminándola. Encontré esta línea en el archivo .storyboard que eliminé manualmente con un editor de texto. <simulatedToolbarMetrics key = "simulatedBottomBarMetrics" />. Esto lo solucionó.
Dave Hubbard
20

Quiero mencionar algo que me sorprendió primero cuando estaba tratando de adaptar una aplicación basada en SpriteKit para evitar los bordes redondeados y la "muesca" del nuevo iPhone X, como lo sugieren las últimas Directrices de interfaz humana : la nueva propiedad safeAreaLayoutGuidede las UIViewnecesidades debe consultarse después de que la vista se haya agregado a la jerarquía (por ejemplo, en -viewDidAppear:) para informar un marco de diseño significativo (de lo contrario, solo devuelve el tamaño de pantalla completa).

De la documentación de la propiedad:

La guía de diseño que representa la parte de su vista que no está oculta por barras y otro contenido. Cuando la vista es visible en la pantalla , esta guía refleja la parte de la vista que no está cubierta por las barras de navegación, las barras de pestañas, las barras de herramientas y otras vistas de antepasados. (En tvOS, el área segura refleja el área que no cubre el bisel de la pantalla). Si la vista no está instalada actualmente en una jerarquía de vistas, o aún no está visible en la pantalla, los bordes de la guía de diseño son iguales a los bordes de la vista .

(énfasis mío)

Si lo lees tan pronto como -viewDidLoad:, layoutFramela guía será en {{0, 0}, {375, 812}}lugar de la esperada{{0, 44}, {375, 734}}

Nicolas Miari
fuente
Igual que aquí. Siempre salto a las propiedades disponibles de un tipo, guiado solo por sus nombres, sin leer completamente los documentos ...
Nicolas Miari
18

ingrese la descripción de la imagen aquí

  • A principios de iOS 7,0-11,0 < Desaprobados > UIKitutiliza el topLayoutGuide y bottomLayoutGuide que es UIViewpropiedad
  • iOS11 + usa safeAreaLayoutGuide que también es UIViewpropiedad

  • Active la casilla de verificación Guía de diseño de área segura del inspector de archivos.

  • Las áreas seguras lo ayudan a colocar sus vistas dentro de la parte visible de la interfaz general.

  • En tvOS , el área segura también incluye las inserciones de sobreexploración de la pantalla, que representan el área cubierta por el bisel de la pantalla.

  • safeAreaLayoutGuide refleja la parte de la vista que no está cubierta por barras de navegación, barras de pestañas, barras de herramientas y otras vistas de antepasados.
  • Use áreas seguras como ayuda para diseñar su contenido como UIButton etc.

  • Al diseñar para iPhone X, debe asegurarse de que los diseños llenen la pantalla y no estén ocultos por las esquinas redondeadas del dispositivo, la carcasa del sensor o el indicador para acceder a la pantalla de inicio.

  • Asegúrese de que los fondos se extiendan hasta los bordes de la pantalla y que los diseños desplazables verticalmente, como tablas y colecciones, continúen hasta el final.

  • La barra de estado es más alta en el iPhone X que en otros iPhones. Si su aplicación asume una altura de barra de estado fija para posicionar el contenido debajo de la barra de estado, debe actualizar su aplicación para posicionar dinámicamente el contenido en función del dispositivo del usuario. Tenga en cuenta que la barra de estado en el iPhone X no cambia la altura cuando las tareas en segundo plano como la grabación de voz y el seguimiento de ubicación están activas print(UIApplication.shared.statusBarFrame.height)//44 for iPhone X, 20 for other iPhones

  • La altura del contenedor del indicador de inicio es de 34 puntos.

  • Una vez que habilite la Guía de diseño de área segura , puede ver la propiedad de restricciones de área segura en el generador de interfaces.

ingrese la descripción de la imagen aquí

Puede establecer restricciones con respectivas de self.view.safeAreaLayoutGuideas-

ObjC:

  self.demoView.translatesAutoresizingMaskIntoConstraints = NO;
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [self.demoView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [self.demoView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [self.demoView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [self.demoView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;

Rápido:

   demoView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            demoView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            demoView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            demoView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
            demoView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        } else {
            NSLayoutConstraint(item: demoView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        }

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Jack
fuente
Considero que esta guía de viñetas es muy útil, pero ¿qué significa exactamente "Área segura que no cubre barras de navegación, barras de pestañas, barras de herramientas y otras vistas de antepasados"?
Chewie The Chorkie
1
Ejemplo: como en la última pantalla anterior Barra de herramientas (hoy, calendarios y bandeja de entrada) que no está cubierta por safreAreaGuide
Jack
8

Apple presentó topLayoutGuide y bottomLayoutGuide como propiedades de UIViewController en iOS 7. Le permitieron crear restricciones para evitar que su contenido se ocultara en barras UIKit como el estado, la navegación o la barra de pestañas. Estas guías de diseño están en desuso en iOS 11 y se reemplazan por una única guía de diseño de área segura.

Consulte el enlace para más información.

Kemo
fuente
5

La Guía de diseño de área segura ayuda a evitar la superposición de elementos de la IU del sistema al colocar contenido y controles.

El Área segura es el área entre los elementos de la IU del sistema que son Barra de estado, Barra de navegación y Barra de herramientas o Barra de pestañas. Entonces, cuando agrega una barra de estado a su aplicación, el área segura se reduce. Cuando agrega una barra de navegación a su aplicación, el área segura se reduce nuevamente.

En el iPhone X, el Área segura proporciona un recuadro adicional desde los bordes superior e inferior de la pantalla en vertical incluso cuando no se muestra ninguna barra. En el paisaje, el área segura se inserta desde los lados de las pantallas y el indicador de inicio.

Esto está tomado del video de Apple Diseño para iPhone X, donde también visualizan cómo los diferentes elementos afectan el Área segura.

Yannick
fuente