He establecido normalmente las restricciones iniciales y finales de una vista. He establecido su altura en estática 325. Y para la restricción inferior, he establecido 2 restricciones 1. con la restricción inferior de la vista principal a la restricción inferior de la vista. 2. con la restricción inferior de la vista principal a la restricción superior de la vista. Ahora, en la acción del usuario, solo muestro ocultar vista con animación. Entonces, cuando la vista se muestra en la pantalla y la aplicación pasa a segundo plano, la restricción de la vista se altera automáticamente y la vista se oculta. Este problema solo ocurre en dispositivos iOS 13.
Traté de actualizar sus restricciones en viewWillAppear () pero en iOS 13 tampoco se llama a viewWillAppear de ViewControllers cuando la aplicación se activa desde el fondo. Además, no creo que sea una buena idea actualizar las restricciones.
class ViewController: UIViewController {
@IBOutlet weak var topConstraint: NSLayoutConstraint!
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
self.topConstraint.isActive = false
self.bottomConstraint.isActive = true
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
}
}
No quiero que mis restricciones se cambien o actualicen cuando el estado de la aplicación cambie de primer plano a segundo plano y viceversa.
Por favor, ayúdame con lo mismo.
TIA
contentView
colocarla debajo de la parte inferior (por lo que está "fuera de la pantalla"), luego desea animarla a la vista ... Luego, la aplicación pasa al fondo , y desea que la vista se siga mostrando cuando la aplicación vuelva al primer plano? No hay nueva animación?.frame = ...
declaraciones explícitas ), entonces su código debería funcionar bien.ViewDidLoad()
debería no ser llamado cuando las transiciones de aplicaciones de fondo a primer plano, a menos que tenga algún otro código que se ejecuta en ese evento.Respuestas:
También se reunió este problema. Noté que las restricciones siguen restableciéndose en caso de que no estén marcadas
Installed
en Interface Builder. Entonces, como solución, mantenga todas las restriccionesInstalled
en IB y cambie elisActive
estado solo en el código.fuente
isActive
en falso, cuando la aplicación pasa a segundo plano y vuelve, volverá a estar activa.Puede lograr la solución al establecer la prioridad y voltear los valores.
fuente
Descubrí que el problema solo ocurre en iOS 13.0 y versiones posteriores. Intente realizar los cambios de restricción en ViewDidLayoutSubviews
fuente
La solución que funcionó para mí fue escuchar
UIApplication.willEnterForegroundNotification
y establecerisActive
todas las restricciones en este punto.Esta notificación parece publicarse después de que el sistema (incorrectamente) restablece todas las restricciones a sus estados IB y antes de que la aplicación vuelva a ser visible. Entonces es el momento perfecto para arreglar las restricciones.
fuente
si necesita saber "cómo puedo informar cuando las aplicaciones vienen de fondo a primer plano". Debe usar NotificationCenter para enviar una señal a todos. Pero esta no es una buena práctica.
Tal vez pueda decir su objetivo, y podemos darle un enfoque diferente.
fuente
Bueno, tengo la solución. En realidad, no podemos decir que sea la solución. Acabo de ejecutar el mismo código en dispositivos iOS 13.1 o versiones superiores y el problema desapareció. Entonces, por ahora, puedo decir que este problema solo ocurre en iOS 13.0.
fuente