Các ràng buộc đặt lại khi ứng dụng chạy trong nền - iOS 13


8

Tôi đã đặt các ràng buộc hàng đầu, theo dõi một cách bình thường. Tôi đã đặt chiều cao của nó thành tĩnh 325. Và đối với ràng buộc dưới cùng, tôi đã đặt 2 ràng buộc 1. với ràng buộc dưới của khung nhìn chính để xem ràng buộc dưới của khung nhìn. 2. với ràng buộc dưới cùng của khung nhìn chính để ràng buộc trên cùng của khung nhìn. Bây giờ trên hành động của người dùng, tôi chỉ hiển thị ẩn xem với hình ảnh động. Vì vậy, khi chế độ xem được hiển thị trên màn hình và ứng dụng ở chế độ nền thì ràng buộc của chế độ xem sẽ tự động bị thay đổi và chế độ xem bị ẩn. Vấn đề này chỉ xảy ra trong các thiết bị iOS 13.

Tôi đã cố cập nhật các ràng buộc của nó trên viewWillAppear () nhưng trong iOS 13, viewWillAppear của ViewControllers cũng không được gọi khi ứng dụng được kích hoạt từ nền. Ngoài ra tôi không nghĩ rằng đây là một ý tưởng tốt để cập nhật các ràng buộc.

Bảng phân cảnh

Tập tin lớp

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

Tôi không muốn các ràng buộc của mình bị thay đổi hoặc cập nhật khi trạng thái ứng dụng thay đổi từ nền trước sang nền và ngược lại.

Xin hãy giúp tôi với cùng.

TIA


1
Bạn đang trộn các ràng buộc với các cài đặt khung rõ ràng, điều này thường sẽ dẫn đến các vấn đề. Không rõ ràng những gì bạn muốn ... Khi chế độ xem của bạn tải, bạn muốn đặt vị trí contentViewbên dưới phía dưới (vì vậy đó là "ngoài màn hình"), sau đó bạn muốn tạo hiệu ứng di chuyển lên để xem ... Sau đó, ứng dụng chuyển sang nền và bạn có muốn chế độ xem vẫn hiển thị khi ứng dụng quay lại nền trước không? Không có hoạt hình mới?
DonMag

Đúng. Tôi chỉ muốn như thế này thôi. Trên thực tế, mã mà tôi đã viết trong viewWillAppear () được thực thi trên hành động của người dùng. Nhưng để giải thích, tôi đã tạo một bản demo.
Rajat Mishra

Giả sử vị trí / kích thước hoạt hình của bạn chỉ hoạt động chính xác với các ràng buộc (không có .frame = ...tuyên bố rõ ràng ), thì mã của bạn sẽ hoạt động tốt. khôngViewDidLoad() nên được gọi khi ứng dụng chuyển từ nền sang tiền cảnh, trừ khi bạn có một số mã khác đang chạy trên sự kiện đó.
DonMag

Câu trả lời:


5

Cũng đã gặp vấn đề này. Lưu ý rằng các ràng buộc tiếp tục đặt lại trong trường hợp nếu chúng không được kiểm tra Installedtrong Trình tạo giao diện. Vì vậy, như cách giải quyết, giữ tất cả các ràng buộc Installedtrong IB và thay đổi isActivetrạng thái chỉ trong mã.

nhập mô tả hình ảnh ở đây


Điều này thực sự không hiệu quả với tôi, vì nếu tôi đặt isActivethành false, thì khi ứng dụng chạy nền và quay lại, nó sẽ hoạt động trở lại.
Chris Vasselli

2

Bạn có thể đạt được giải pháp bằng cách đặt mức độ ưu tiên và lật các giá trị.

 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

Tôi thấy sự cố chỉ xảy ra trong iOS 13.0 trở lên, Vui lòng thử thực hiện các thay đổi ràng buộc trong ViewDidLayoutSubview

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

Nó làm việc như một say mê. Nhưng tại sao nó chỉ xảy ra trong iOS 13.0? & tại sao viewWillAppear không được gọi?
Suhail

1

Cách giải quyết phù hợp với tôi là lắng nghe UIApplication.willEnterForegroundNotificationvà đặt ra isActivemọi ràng buộc vào thời điểm này.

Thông báo này dường như được công bố sau khi hệ thống (không chính xác) đặt lại tất cả các ràng buộc đối với trạng thái IB của chúng và trước khi ứng dụng hiển thị lại. Vì vậy, đây là thời điểm hoàn hảo để khắc phục các hạn chế.


0

nếu bạn cần biết "làm thế nào tôi có thể thông báo khi ứng dụng chạy nền trước". Bạn nên sử dụng NotificationCenter để gửi tín hiệu cho tất cả. Nhưng đây là một thực hành không tốt.

Có lẽ bạn có thể nói mục tiêu của bạn và chúng tôi có thể cung cấp cho bạn cách tiếp cận khác.


0

Vâng, tôi đã có giải pháp. Thật ra, chúng ta không thể nói đó là giải pháp. Tôi chỉ chạy cùng mã trong các thiết bị iOS 13.1 trở lên và sự cố đã biến mất. Vì vậy, bây giờ tôi có thể nói vấn đề này chỉ xảy ra trong iOS 13.0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.