Einschränkungen werden zurückgesetzt, wenn die App im Hintergrund ausgeführt wird - iOS 13

8

Ich habe die führenden, nachfolgenden Einschränkungen einer Ansicht normalerweise festgelegt. Ich habe die Höhe auf statisch 325 festgelegt. Und für die untere Einschränkung habe ich 2 Einschränkungen festgelegt: 1. Die untere Einschränkung der Hauptansicht entspricht der unteren Einschränkung der Ansicht. 2. mit der unteren Einschränkung der Hauptansicht zur oberen Einschränkung der Ansicht. Jetzt zeige ich auf Benutzeraktion nur die Ansicht ausblenden mit Animation. Wenn die Ansicht auf dem Bildschirm angezeigt wird und die App im Hintergrund angezeigt wird, wird die Einschränkung der Ansicht automatisch geändert und die Ansicht wird ausgeblendet. Dieses Problem tritt nur bei iOS 13-Geräten auf.

Ich habe versucht, die Einschränkungen für viewWillAppear () zu aktualisieren, aber in iOS 13 wird viewWillAppear von ViewControllers auch nicht aufgerufen, wenn die App über den Hintergrund aktiviert wird. Ich denke auch nicht, dass dies eine gute Idee ist, um Einschränkungen zu aktualisieren.

Storyboard

Klassendatei

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

Ich möchte nicht, dass meine Einschränkungen geändert oder aktualisiert werden, wenn sich der App-Status von Vordergrund zu Hintergrund und umgekehrt ändert.

Bitte helfen Sie mir dabei.

TIA

Rajat Mishra
quelle
1
Sie mischen Einschränkungen mit expliziten Rahmeneinstellungen, was normalerweise zu Problemen führt. Nicht ganz klar, was Sie wollen ... Wenn Ihre Ansicht geladen wird, möchten Sie sie contentViewunter dem unteren Rand positionieren (also "außerhalb des Bildschirms") und dann animieren, um sie in die Ansicht zu verschieben ... Dann geht die App in den Hintergrund und Sie möchten, dass die Ansicht weiterhin angezeigt wird, wenn die App wieder in den Vordergrund tritt? Keine neue Animation?
DonMag
Ja. Ich will nur so. Eigentlich der Code, den ich in viewWillAppear () geschrieben habe, der für die Aktion des Benutzers ausgeführt wird. Aber zur Erklärung habe ich eine Demo erstellt.
Rajat Mishra
Angenommen, Ihre Animationsposition / -größe funktioniert nur mit Einschränkungen korrekt (keine expliziten .frame = ...Anweisungen), dann sollte Ihr Code einwandfrei funktionieren. ViewDidLoad()sollte nicht aufgerufen werden, wenn die App vom Hintergrund in den Vordergrund wechselt, es sei denn, auf diesem Ereignis wird ein anderer Code ausgeführt.
DonMag

Antworten:

5

Auch dieses Problem erfüllt. Es wurde festgestellt, dass Einschränkungen immer wieder zurückgesetzt werden, falls sie Installedim Interface Builder nicht aktiviert sind . Behalten Sie als Problemumgehung alle Einschränkungen Installedin IB bei und ändern Sie den isActiveStatus nur im Code.

Geben Sie hier die Bildbeschreibung ein

Brigadir
quelle
Das hat bei mir eigentlich nicht funktioniert, denn wenn ich isActiveauf false gesetzt habe, wird die App wieder aktiv, wenn sie in den Hintergrund und zurück wechselt.
Chris Vasselli
2

Sie können die Lösung erreichen, indem Sie die Priorität festlegen und die Werte umdrehen.

 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()
Yogeswaran S.
quelle
2

Ich habe festgestellt, dass das Problem nur in iOS 13.0 und höher auftritt. Bitte versuchen Sie, die Änderungen an den Einschränkungen in ViewDidLayoutSubviews vorzunehmen

      override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
            self.bottomConstraint.isActive = false
            self.topConstraint.isActive = true
    self.view.layoutIfNeeded()
}
Yogeswaran S.
quelle
Es funktionierte wie ein Zauber. Aber warum passiert das nur in iOS 13.0? & warum wird viewWillAppear nicht aufgerufen?
Suhail
1

Die Problemumgehung, die für mich funktioniert hat, bestand darin UIApplication.willEnterForegroundNotification, isActiveauf alle Einschränkungen zu achten und sie an dieser Stelle festzulegen.

Diese Benachrichtigung scheint veröffentlicht zu werden, nachdem das System (fälschlicherweise) alle Einschränkungen auf ihren IB-Status zurückgesetzt hat und bevor die App wieder sichtbar wird. Es ist also der perfekte Zeitpunkt, um die Einschränkungen zu beheben.

Chris Vasselli
quelle
0

Wenn Sie wissen müssen, "wie kann ich informieren, wenn die Apps in den Vordergrund treten". Sie sollten NotificationCenter verwenden, um ein Signal an alle zu senden. Dies ist jedoch keine gute Praxis.

Vielleicht können Sie Ihr Ziel mitteilen, und wir können Ihnen einen anderen Ansatz geben.

Emre Gürses
quelle
0

Nun, ich habe die Lösung. Eigentlich können wir es nicht als Lösung bezeichnen. Ich habe gerade den gleichen Code auf Geräten mit iOS 13.1 oder höher ausgeführt und das Problem war behoben. Daher kann ich vorerst sagen, dass dieses Problem nur in iOS 13.0 auftritt.

Rajat Mishra
quelle