簡體   English   中英

應用程序在后台運行時重置約束 - iOS 13

[英]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

也遇到了這個問題。 請注意,如果未在 Interface Builder 中選中Installed ,約束會不斷重置。 因此,作為解決方法,將所有約束都Installed在 IB 中並僅在代碼中更改isActive state。

在此處輸入圖像描述

對我有用的解決方法是監聽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 中。

每當我嘗試更新在 storyboard 上設置了變化的約束constant時,我也遇到了類似的問題。 要解決這個問題,只需刪除所有變體並以編程方式設置它們。

變體截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM