ios - remove - safearealayoutguide




safeAreaInsets en UIView es 0 en un iPhone X (5)

El método viewDidAppear (_ :) del controlador de vista de contenedor que extiende el área segura de su controlador de vista secundario integrado para tener en cuenta las vistas en.

Realice sus modificaciones en este método porque las inserciones de área segura para una vista no son precisas hasta que la vista se agrega a una jerarquía de vistas.

override func viewDidAppear(_ animated: Bool) {

   if (@available(iOS 11, *)) {

     var newSafeArea = view.safeAreaInsets

     // Adjust the safe area to accommodate 
     //  the width of the side view.

     if let sideViewWidth = sideView?.bounds.size.width {
        newSafeArea.right += sideViewWidth
     }

    // Adjust the safe area to accommodate 
    //  the height of the bottom view.
    if let bottomViewHeight = bottomView?.bounds.size.height {
       newSafeArea.bottom += bottomViewHeight
    }

    // Adjust the safe area insets of the 
    //  embedded child view controller.
    let child = self.childViewControllers[0]
    child.additionalSafeAreaInsets = newSafeArea
  } 
}

Estoy actualizando mi aplicación para adaptarla para iPhone X. Todas las vistas funcionan bien ahora, excepto una. Tengo un controlador de vista que presenta una vista UIV personalizada que cubre toda la pantalla. Antes de usar UIScreen.main.bounds para averiguar el tamaño de la vista antes de que se hiciera todo el diseño (lo necesito para colocar el ItemSize correcto para una collectionView). Pensé que ahora podía hacer algo como UIScreen.main.bounds.size.height - safeAreaInsets.bottom para obtener el tamaño adecuado para usar. El problema es que safeAreaInsets devuelve (0,0,0,0) probando un iPhone X (Simulador). ¿Algunas ideas? En otras vistas, obtengo los números correctos para safeAreaInsets.

¡Gracias!


Me he encontrado con el mismo problema. En mi caso, la vista que estoy insertando se dimensionaría correctamente después de llamar a view.layoutIfNeeded() . Los view.safeAreaInsets se configuraron después de esto, pero solo el valor top era correcto. El valor inferior todavía era 0 (esto en un iPhone X).

Al tratar de averiguar en qué punto se configuran correctamente los conjuntos de safeAreaInsets , agregué un punto de interrupción en el método de safeAreaInsetsDidChange() de safeAreaInsetsDidChange() la vista safeAreaInsetsDidChange() . Esto se llamaba varias veces, pero solo cuando vi CALayer.layoutSublayers() en el backtrace el valor se había establecido correctamente.

Por lo tanto, he reemplazado view.layoutIfNeeded() por la contraparte de view.layer.layoutIfNeeded() , lo que dio como resultado que safeAreaInsets se configurara correctamente de inmediato, por lo que resolví mi problema.

TL; DR

Reemplazar

view.layoutIfNeeded()

por

view.layer.layoutIfNeeded()

También me he topado con este problema al intentar subir las vistas para dar paso al teclado en el iPhone X. Los SafeAreaInsets de la vista principal son siempre 0, aunque sé que las subvistas se han presentado en este punto como la pantalla ha sido dibujado Una solución que encontré, como se mencionó anteriormente, es obtener KeyWindow y verificar sus inserciones de área segura en su lugar.

Obj-C:

CGFloat bottomInset = [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;

Rápido:

let bottomInset = UIApplication.shared.keyWindow?.safeAreaInsets.bottom

Luego puede usar este valor para ajustar restricciones o ver marcos según sea necesario.


También tiene la opción, si usa el diseño automático, de mantener su restricción inferior para view.safeAreaLayoutGuide.bottomAnchor ! Su diseño estará constantemente actualizado sin necesidad de observar los cambios.


Ya encontré la solución: estaba haciendo toda la implementación en el init de la vista. safeAreaInsets tiene el tamaño correcto en layoutSubviews()





iphone-x