         change: [NSKeyValueChangeKey: Any]?,
         context _: UnsafeMutableRawPointer?
     ) {
-        if let change = change {
-            if let old = change[.oldKey] as? CGRect, let new = change[.newKey] as? CGRect, old.size.isNearlyEqual(to: new.size) {
-                return
-            }
-            if change[.newKey] as? UIEdgeInsets != nil, _view?.window == nil {
+        guard let change = change, _setupComplete, !_suppressUpdates else {
+            return
+        }
+        if let new = change[.newKey] as? CGRect {
+            if !new.size.isNearlyEqual(to: frame.size) {
+                var root = self
+                while let parent = root.parent {
+                    root = parent
+                }
+                if root._view?.superview != nil {
+                    root.update()
+                }
+            }
+            return
+        }
+        if change[.newKey] as? UIEdgeInsets != nil {
+            if _view?.window != nil {
                 // If not yet mounted, safe area insets can't be valid
-                return
-            }
-        }
-        update()
-    }
-
-    @objc private func contentSizeChanged() {
+                update()
+            }
+            return
+        }
+    }
+
+    @objc private func contentSizeCategoryChanged() {
         guard _setupComplete else {
             return
         }

        }
    }

    private var _observingFrame = false
    private func _stopObservingFrame() {
        if _observingFrame {
            NotificationCenter.default.removeObserver(self)
            removeObserver(self, forKeyPath: "_view.frame")
            removeObserver(self, forKeyPath: "_view.bounds")
            _observingFrame = false

    }

    private func stopObserving() {
        _stopObservingContentSizeCategory()
        _stopObservingFrame()
        _stopObservingInsets()
    }

    private func updateObservers() {
        if _observingContentSizeCategory, parent != nil {
            _stopObservingContentSizeCategory()
        } else if !_observingContentSizeCategory, parent == nil {
            NotificationCenter.default.addObserver(self, selector: #selector(contentSizeCategoryChanged), name: .UIContentSizeCategoryDidChange, object: nil)
        }
        if !_observingFrame {
            addObserver(self, forKeyPath: "_view.frame", options: [.new], context: nil)
            addObserver(self, forKeyPath: "_view.bounds", options: [.new], context: nil)
            _observingFrame = true
        }
        if _observingInsets, viewControllerClass == nil {
