     }
 
     private func stopObserving() {
+        _stopObservingContentSizeCategory()
         _stopObservingFrame()
         _stopObservingInsets()
     }
 
     private func updateObservers() {
-        if _observingFrame, parent != nil {
-            _stopObservingFrame()
-        } else if !_observingFrame, parent == nil {
-            NotificationCenter.default.addObserver(self, selector: #selector(contentSizeChanged), name: .UIContentSizeCategoryDidChange, object: nil)
-            addObserver(self, forKeyPath: "_view.frame", options: [.old, .new], context: nil)
-            addObserver(self, forKeyPath: "_view.bounds", options: [.old, .new], context: nil)
+        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 {

        }
    }

    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

        change: [NSKeyValueChangeKey: Any]?,
        context _: UnsafeMutableRawPointer?
    ) {
        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
                update()
            }
            return
        }
    }

    @objc private func contentSizeCategoryChanged() {
        guard _setupComplete else {
            return
        }
