ios - El diseño automático no es válido después de presentar el controlador de vista(y muchas situaciones)
presentviewcontroller swift 4 (6)
Probablemente es causada por restricciones ambiguas. Recomiendo pausar una aplicación en ejecución y escribir un comando siguiente para la consola:
po [[UIWindow keyWindow] _autolayoutTrace]
Esta pregunta ya tiene una respuesta aquí:
Fondo:
Tengo un controlador de contenedor personalizado, que al igual que UITabBarController, pero con conmutación de animación. Y yo uso el diseño automático para lograr.
Debido a que el cambio entre controladores secundarios es dinámico, las restricciones adecuadas se agregan al controlador de vista secundaria cuando su vista se agrega a la vista del contenedor, no a la configuración previa en IB. (Las restricciones se agregan a la supervisión, por supuesto)
http://d.pr/i/q6NF Configuración de Nib de controlador de contenedor
PD: El detalle de las restricciones.
H: | [Child] (Cambia la constante de la restricción a animación de izquierda / derecha a derecha / izquierda)
H: [Niño (== Super)]
V: | [Niño] |
Dónde está el problema:
Uno de los controladores secundarios es un controlador de navegación, las cosas van mal cuando el controlador de navegación presenta un controlador de vista modal (usando presentViewController:animated:completion:
, y lo dismissViewControllerAnimated:completion:
(usando la dismissViewControllerAnimated:completion:
descartada de dismissViewControllerAnimated:completion:
, después del presente / descarte el marco el controlador de navegación se convierte en (x, y, 0, 0). Parece que el diseño automático no es válido, tal vez se eliminaron las restricciones.
http://d.pr/i/VmvL El proceso presente / despido
Investigación
No he usado el código para verificar qué sucede con estas restricciones todavía, pero con Spark Inspector veo que la presentación de las vistas cambia durante el proceso de presente / rechazo. Cuando Mi controlador de navegación presenta un controlador de vista modal, iOS simplemente cambia toda la vista del controlador de navegación a la vista del controlador de vista modal. Y cuando vuelve la vista del controlador de navegación, el diseño automático ya no funciona.
Solución posible
Una de las soluciones que encontré es dejar que mi controlador de contenedores presente el controlador modal.
O simplemente cambio mi controlador de contenedor a ningún diseño automático.
El hecho es que desde que comencé a usar el diseño automático, los problemas que causa esta técnica solo dominan los beneficios. Además de este problema , cada vez que cambia la orientación de la interfaz, las vistas dentro de mi controlador de contenedores simplemente no se pueden diseñar correctamente, parece que las subvistas siempre usan el marco de supervisión de la vista antes del cambio de orientación. Compruebo las restricciones que configuro, no hay conflictos ni ambigüedad.
Supongo que mi controlador de contenedor personalizado no es compatible con la presentación del controlador de vista modal y el cambio de orientación de la interfaz en el sistema de diseño automático, incluso con la configuración de restricciones.
Entorno Xcode
Xcode 5 beta, iOS 7SDK, objetivo iOS6.1 ¿ Tal vez algo no está bien con el entorno SDK?
Si utiliza la distribución automática entre la UIWindow
y su vista raíz (para configurar la vista raíz para que ocupe toda la UIWindow
), estas restricciones se verán UIWindow
por una presentación en pantalla completa de otro controlador de vista.
Lo que sucede es que toda la jerarquía de la presentación a pantalla completa reemplaza todo lo que se encuentra debajo de UIWindow
: se UIWindow
su vista original (eliminando las restricciones) y se sustituyó la nueva jerarquía de vistas. Luego, cuando se reemplaza su revisión, estas restricciones se pierden. Necesitaría recrearlos en algún lugar como viewWillAppear:
o simplemente asegurarse de que su vista raíz tenga self.view.translatesAutoresizingMaskIntoConstraints = NO;
También tengo el mismo problema y cuando probé este controlador de navegación funcionaba bien pero no con el controlador de vista actual. Utilice este método de controlador de vista a continuación junto con translatesAutoresizingMaskIntoConstraints para resolver este problema.
-(void) viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
self.view.translatesAutoresizingMaskIntoConstraints = NO;
}
Por favor déjame ahora si tienes alguna preocupación al respecto. Gracias
Tuve el mismo problema, con un contenedor de la barra de búsqueda como el elemento fuera de lugar (dentro de un UIViewController, dentro de un UITabBarController). Ninguna de las otras soluciones que he visto funcionaron, pero al final logré solucionar el problema volviendo a agregar la restricción de diseño en viewWillAppear:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview
attribute: NSLayoutAttributeTop
relatedBy: NSLayoutRelationEqual
toItem: self.view
attribute: NSLayoutAttributeTop
multiplier: 1
constant: 0]];
Tuve un problema similar . Estaba configurando translatesAutoresizingMaskIntoConstraints = NO;
en mi raíz UIView. Aparece la vista UIV "más externa": la vista de supervisión en la raíz de su jerarquía debe usar el valor predeterminado de tradlatesAutoresizingMaskIntoConstraints translatesAutoresizingMaskIntoConstraints = YES
. Una vez que he eliminado esto, todo funcionó como se esperaba.
Tuve un problema similar con las celdas de vista de tabla que estaba diseñando con autolayout. Al regresar de una vista modal, las celdas tenían un diseño no válido. Podría rediseñar cada celda después de viewDidAppear, pero se veía terrible. Gracias a la sugerencia de @ palimondo, comencé a oler alrededor de TranslatesAutoresizingMaskIntoConstraints. Resulta que estaba configurando la vista de contenido de mi celda de vista de tabla en translatesAutoresizingMaskIntoConstraints = NO
cuando no debería haberlo hecho.