Ограничения сбрасываются, когда приложение движется в фоновом режиме - iOS 13 - PullRequest
5 голосов
/ 14 октября 2019

Я обычно устанавливал ведущие, конечные ограничения представления. Я установил его высоту равным 325. И для нижнего ограничения я установил 2 ограничения 1. с нижним ограничением основного вида для нижнего ограничения вида. 2. с нижним ограничением основного вида для просмотра верхнего ограничения. Теперь по действию пользователя я просто показываю скрытый вид с анимацией. Таким образом, когда представление отображается на экране, а приложение переходит в фоновый режим, ограничение представления автоматически изменяется, и представление скрывается. Эта проблема возникает только на устройствах с iOS 13.

Я попытался обновить его ограничения на viewWillAppear (), но в iOS 13 viewWillAppear ViewControllers также не вызывается, когда приложение активируется из фона. Также я не думаю, что это хорошая идея для обновления ограничений.

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

Ответы [ 5 ]

2 голосов
/ 30 октября 2019

Также встречал эту проблему. Заметил, что ограничения продолжают сбрасываться в случае, если они не отмечены Installed в Интерфейсном Разработчике. Таким образом, в качестве обходного пути сохраните все ограничения Installed в IB и измените состояние isActive только в коде.

enter image description here

1 голос
/ 17 октября 2019

Вы можете достичь решения, установив приоритет и щелкнув значениями.

 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()
0 голосов
/ 31 октября 2019

Ну, я получил решение. На самом деле, мы не можем сказать, что это решение. Я просто запускаю тот же код на устройствах iOS 13.1 или более поздней версии, и проблема исчезла. Так что сейчас я могу сказать, что эта проблема возникает только в iOS 13.0.

0 голосов
/ 17 октября 2019

Я обнаружил, что проблема возникает только в iOS 13.0 и выше. Пожалуйста, попробуйте внести ограничения в ViewDidLayoutSubviews

      override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
            self.bottomConstraint.isActive = false
            self.topConstraint.isActive = true
    self.view.layoutIfNeeded()
}
0 голосов
/ 16 октября 2019

, если вам нужно знать, «как я могу сообщить, когда приложения выходят на задний план». Вы должны использовать NotificationCenter, чтобы отправить сигнал всем. Но это не очень хорошая практика.

Может быть, вы можете сказать свою цель, и мы можем дать вам другой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...