web-dev-qa-db-ja.com

アプリがバックグラウンドで実行されているときに制約がリセットされる-iOS 13

通常、ビューの先頭と末尾の制約を設定しました。私はその高さを静的な325に設定しました。また、下部の制約については、2つの制約1.メインビューの下部の制約をビューの下部の制約に設定しました。 2.メインビューの下部の制約とビューの上部の制約。ユーザーのアクションで、アニメーションでビューを非表示にするだけです。したがって、ビューが画面に表示され、アプリがバックグラウンドになると、ビューの制約が自動的に変更され、ビューが非表示になります。この問題はiOS 13デバイスでのみ発生します。

ViewWillAppear()の制約を更新しようとしましたが、iOS 13では、アプリがバックグラウンドからアクティブ化されたときにViewControllersのviewWillAppearも呼び出されません。また、私は、これは制約を更新するための良いアイデアだとは思いません。

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

アプリの状態がフォアグラウンドからバックグラウンドに、またはその逆に変化したときに、制約を変更または更新したくありません。

同じことで私を助けてください。

TIA

8
Rajat Mishra

この問題も満たしました。制約がInterface BuilderでInstalledにチェックされていない場合に備えて、制約がリセットされ続けることに注意してください。したがって、回避策として、すべての制約InstalledをIBに保持し、isActive状態をコード内で変更します。

enter image description here

5
brigadir

優先順位を設定して値を反転させることで、ソリューションを実現できます。

 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

この問題はiOS 13.0以降でのみ発生していることがわかりました。ViewDidLayoutSubviewsで制約を変更してみてください

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

さて、私は解決策を得ました。実際には、それが解決策であるとは言えません。 iOS 13.1以降のバージョンのデバイスで同じコードを実行しただけで、問題は解決しました。今のところ、この問題はiOS 13.0でのみ発生すると言えます。

0
Rajat Mishra

「アプリがバックグラウンドからフォアグラウンドになったときに通知する方法」を知る必要がある場合。すべてにシグナルを送信するには、NotificationCenterを使用する必要があります。しかし、これは良い習慣ではありません。

多分あなたはあなたの目的を言うことができます、そして私たちはあなたに異なるアプローチを与えることができます。

0
Emre Gürses