iPhone : camera autofocus observer?

后端 未结 3 486
迷失自我
迷失自我 2020-12-08 05:38

I would like to know if it\'s possible to receive notification about autofocus inside an iPhone application?

I.E, does it exist a way to be notified when autofocus s

相关标签:
3条回答
  • 2020-12-08 05:47

    You can use modern Swift key value observing api to get callbacks when focusing starts and ends by observing AVCaptureDeviceInput.device.isAdjustingFocus property. In the example below, instance of AVCaptureDeviceInput is called captureDeviceInput.

    Example:

    self.focusObservation = observe(\.captureDeviceInput.device.isAdjustingFocus, options: .new) { _, change in
        guard let isAdjustingFocus = change.newValue else { return }
    
        print("isAdjustingFocus = \(isAdjustingFocus)")
    
    }
    
    0 讨论(0)
  • 2020-12-08 05:56

    Swift 3

    Set focus mode on your AVCaptureDevice instance:

    do {
         try videoCaptureDevice.lockForConfiguration()
         videoCaptureDevice.focusMode = .continuousAutoFocus
         videoCaptureDevice.unlockForConfiguration()
    } catch {}
    

    Add observer:

    videoCaptureDevice.addObserver(self, forKeyPath: "adjustingFocus", options: [.new], context: nil)
    

    Override observeValue:

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    
        guard let key = keyPath, let changes = change else { 
            return
        }
    
        if key == "adjustingFocus" {
    
            let newValue = changes[.newKey]
            print("adjustingFocus \(newValue)")
        }
    }
    
    0 讨论(0)
  • 2020-12-08 06:02

    I find the solution for my case to find when autofocus starts / ends. It's simply dealing with KVO (Key-Value Observing).

    In my UIViewController:

    // callback
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if( [keyPath isEqualToString:@"adjustingFocus"] ){
            BOOL adjustingFocus = [ [change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1] ];
            NSLog(@"Is adjusting focus? %@", adjustingFocus ? @"YES" : @"NO" );
            NSLog(@"Change dictionary: %@", change);
        }
    }
    
    // register observer
    - (void)viewWillAppear:(BOOL)animated{
        AVCaptureDevice *camDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        int flags = NSKeyValueObservingOptionNew; 
        [camDevice addObserver:self forKeyPath:@"adjustingFocus" options:flags context:nil];
    
        (...)   
    }
    
    // unregister observer
    - (void)viewWillDisappear:(BOOL)animated{
        AVCaptureDevice *camDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        [camDevice removeObserver:self forKeyPath:@"adjustingFocus"];
    
        (...)
    }
    

    Documentation:

    • Key-Value Observing programming guide
    • NSKeyValueObserving protocol
    0 讨论(0)
提交回复
热议问题