web-dev-qa-db-fra.com

Les contraintes sont réinitialisées lorsque l'application passe en arrière-plan - iOS 13

J'ai défini normalement les contraintes principales et finales d'une vue. J'ai défini sa hauteur sur 325 statique. Et pour la contrainte inférieure, j'ai défini 2 contraintes 1. avec la contrainte inférieure de la vue principale pour la contrainte inférieure de la vue. 2. avec la contrainte inférieure de la vue principale pour la contrainte supérieure de la vue. Maintenant, sur l'action de l'utilisateur, je montre simplement la vue cachée avec une animation. Ainsi, lorsque la vue s'affiche à l'écran et que l'application passe en arrière-plan, la contrainte de la vue est automatiquement modifiée et la vue est masquée. Ce problème se produit uniquement sur les appareils iOS 13.

J'ai essayé de mettre à jour ses contraintes sur viewWillAppear () mais dans iOS 13, le viewWillAppear de ViewControllers n'est également pas appelé lorsque l'application est activée en arrière-plan. Je ne pense pas non plus que ce soit une bonne idée de mettre à jour les contraintes.

Storyboard

Class File

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()
            }
        }
    }
}

Je ne veux pas que mes contraintes soient modifiées ou mises à jour lorsque l'état de l'application passe du premier plan à l'arrière-plan et vice versa.

Veuillez m'aider avec la même chose.

TIA

8
Rajat Mishra

A également rencontré ce problème. Nous avons remarqué que les contraintes continuent d'être réinitialisées au cas où elles ne seraient pas vérifiées Installed dans Interface Builder. Ainsi, comme solution de contournement, conservez toutes les contraintes Installed dans IB et changez l'état isActive juste dans le code.

enter image description here

5
brigadir

Vous pouvez obtenir la solution en définissant la priorité et en inversant les valeurs.

 if !isShowing{
       self.bottomConstraint.priority = UILayoutPriority(rawValue: 250)
       self.topConstraint.priority = UILayoutPriority(rawValue: 750)
   }else{
       self.bottomConstraint.priority = UILayoutPriority(rawValue: 750)
       self.topConstraint.priority = UILayoutPriority(rawValue: 200)
   }
   isShowing = !isShowing
   self.subview.layoutIfNeeded()
2
Yogeswaran S

J'ai trouvé que le problème se produit uniquement dans iOS 13.0 et supérieur, veuillez essayer de faire les changements de contrainte dans ViewDidLayoutSubviews

      override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
            self.bottomConstraint.isActive = false
            self.topConstraint.isActive = true
    self.view.layoutIfNeeded()
}
2
Yogeswaran S

Eh bien, j'ai la solution. En fait, nous ne pouvons pas dire que c'est la solution. Je viens d'exécuter le même code dans les appareils iOS 13.1 ou version supérieure et le problème avait disparu. Donc, pour l'instant, je peux dire que ce problème se produit uniquement dans iOS 13.0.

0
Rajat Mishra

si vous avez besoin de savoir "comment puis-je informer lorsque les applications passent du fond au premier plan". Vous devez utiliser NotificationCenter pour envoyer un signal à tous. Mais ce n'est pas une bonne pratique.

Peut-être que vous pouvez dire votre objectif et nous pouvons vous donner une approche différente.

0
Emre Gürses