Cannot KVO AVCaptureDevice.(is)portraitEffectEnabled with Swift

I have a UIViewController with the following code. I have tried isPortraitEffectEnabled and portraitEffectEnabled, both have the same result: observeValue() is never called.

What am I missing?

To test this I am toggling the value of portaitEffectEnabled by calling AVCaptureDevice.showSystemUserInterface(.videoEffects) and turning it on/off, and expecting the KVO to fire.

@objc class EventSettingsCaptureViewController : UIViewController, ... {

    required init(...) {
        super.init(nibName: nil, bundle: nil)

        if #available(iOS 15.0, *) {
            AVCaptureDevice.self.addObserver(self, forKeyPath: "portraitEffectEnabled", options: [.new], context: nil)
        }
    }

    deinit {
        if #available(iOS 15.0, *) {
            AVCaptureDevice.self.removeObserver(self, forKeyPath: "portraitEffectEnabled", context: nil)
        }
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        // Breakpoint set here: never hits
        if keyPath == "portraitEffectEnabled" {
            guard let object = object as? AVCaptureDevice.Type else { return }

            if #available(iOS 15.0, *) {
                WLog("isPortraitEffectEnabled changed: \(object.isPortraitEffectEnabled)")
            }

        } else {
            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        }
    }

Accepted Reply

... as was pointed out elsewhere, I had thought this member was static but it is not, it is an instance member.

Replies

... as was pointed out elsewhere, I had thought this member was static but it is not, it is an instance member.