[英]Constraints resets when app is going in background - iOS 13
我已經正常設置了視圖的前導、尾隨約束。 我已將其高度設置為 static 325。對於底部約束,我設置了 2 個約束 1. 主視圖的底部約束到視圖的底部約束。 2.主視圖的底部約束到視圖的頂部約束。 現在在用戶的操作中,我只使用 animation 顯示隱藏視圖。 因此,當視圖顯示在屏幕上並且應用程序進入后台時,視圖的約束會自動更改並且視圖會被隱藏。 此問題僅發生在 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()
}
}
}
}
當應用程序 state 從前台更改為后台時,我不希望我的約束被更改或更新,反之亦然。
請幫助我。
TIA
對我有用的解決方法是監聽UIApplication.willEnterForegroundNotification
,並在此時對所有約束設置isActive
。
此通知似乎是在系統(錯誤地)將所有約束重置為其 IB 狀態之后,並且在應用程序再次可見之前發布的。 因此,這是修復約束的最佳時機。
一個警告:當您的約束包含在自動調整大小的表格視圖單元格中時,此通知似乎在系統計算單元格的高度后觸發。 因此,您需要在更新約束后觸發表格視圖以重新計算單元格高度(有關如何執行此操作的信息,請參閱此問題)。
我發現問題僅在 iOS 13.0 及更高版本中發生,請嘗試在 ViewDidLayoutSubviews 中進行約束更改
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.bottomConstraint.isActive = false
self.topConstraint.isActive = true
self.view.layoutIfNeeded()
}
您可以通過設置優先級和翻轉值來實現解決方案。
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()
如果您需要知道“我如何通知應用程序何時從后台轉到前台”。 您應該使用 NotificationCenter 向所有人發送信號。 但這是一個不好的做法。
也許你可以說出你的目標,我們可以給你不同的方法。
好吧,我得到了解決方案。 實際上,我們不能說它是解決方案。 我只是在 iOS 13.1 或更高版本的設備中運行相同的代碼,問題就消失了。 所以現在我可以說這個問題只發生在 iOS 13.0 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.