通常、ビューの先頭と末尾の制約を設定しました。私はその高さを静的な325に設定しました。また、下部の制約については、2つの制約1.メインビューの下部の制約をビューの下部の制約に設定しました。 2.メインビューの下部の制約とビューの上部の制約。ユーザーのアクションで、アニメーションでビューを非表示にするだけです。したがって、ビューが画面に表示され、アプリがバックグラウンドになると、ビューの制約が自動的に変更され、ビューが非表示になります。この問題はiOS 13デバイスでのみ発生します。
ViewWillAppear()の制約を更新しようとしましたが、iOS 13では、アプリがバックグラウンドからアクティブ化されたときにViewControllersのviewWillAppearも呼び出されません。また、私は、これは制約を更新するための良いアイデアだとは思いません。
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
優先順位を設定して値を反転させることで、ソリューションを実現できます。
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()
この問題はiOS 13.0以降でのみ発生していることがわかりました。ViewDidLayoutSubviewsで制約を変更してみてください
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.bottomConstraint.isActive = false
self.topConstraint.isActive = true
self.view.layoutIfNeeded()
}
さて、私は解決策を得ました。実際には、それが解決策であるとは言えません。 iOS 13.1以降のバージョンのデバイスで同じコードを実行しただけで、問題は解決しました。今のところ、この問題はiOS 13.0でのみ発生すると言えます。
「アプリがバックグラウンドからフォアグラウンドになったときに通知する方法」を知る必要がある場合。すべてにシグナルを送信するには、NotificationCenterを使用する必要があります。しかし、これは良い習慣ではありません。
多分あなたはあなたの目的を言うことができます、そして私たちはあなたに異なるアプローチを与えることができます。