2016-10-13 1 views
0

Savez-vous ce que je peux ajouter des observateurs lors de l'utilisation continuousAutoFocus dans AVCaptureDevice par exemple:observateurs continu à Swift AutoFocus

videoCaptureDevice?.exposureMode = .continuousAutoExposure 
videoCaptureDevice?.focusMode = .continuousAutoFocus 

Je voudrais savoir quand le matériel arrête pour que je mise au point automatique KAN montrer quelques animations.

Ce code ne fonctionne que pour videoCaptureDevice?.focusMode = .autoFocus:

videoCaptureDevice?.addObserver(self, forKeyPath: "adjustingFocus", options: NSKeyValueObservingOptions.new, context: nil) 

Merci.

EDIT:

Voici le code complet:

override func viewDidLoad() { 
    super.viewDidLoad() 

    view.backgroundColor = UIColor.black 
    captureSession = AVCaptureSession() 

    let videoInput: AVCaptureDeviceInput 

    do { 
     videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 

     if captureSession.canAddInput(videoInput) { 
      captureSession.addInput(videoInput) 

      let metadataOutput = AVCaptureMetadataOutput() 

      if captureSession.canAddOutput(metadataOutput) { 
       captureSession.addOutput(metadataOutput) 

       metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
       metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes // Use all metadata object types by default. 

      } else { 
       scanningActivationFailed() 
       return 
      } 

      if (videoCaptureDevice?.isFocusModeSupported(.continuousAutoFocus))! { 
       do { 
        if(try videoCaptureDevice?.lockForConfiguration()) != nil { 
         videoCaptureDevice?.exposureMode = .continuousAutoExposure 
         videoCaptureDevice?.focusMode = .continuousAutoFocus 
         videoCaptureDevice?.unlockForConfiguration() 
        } 
       } catch { 

       } 
      } 

      videoCaptureDevice?.addObserver(self, forKeyPath: "adjustingFocus", options: NSKeyValueObservingOptions.new, context: nil) 
      let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ScannerViewController.focusCapture(_:))) 
      mainView.addGestureRecognizer(tapGesture) 

      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
      previewLayer.frame = view.layer.bounds; 
      previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
      mainView.layer.addSublayer(previewLayer); 

      /* 
      // Initialize code Frame to highlight the code 
      codeFrameView.layer.borderColor = UIColor.green.cgColor 
      codeFrameView.layer.borderWidth = 2 
      view.addSubview(codeFrameView) 
      view.bringSubview(toFront: codeFrameView) 
      */ 

      captureSession.startRunning() 

     } else { 
      scanningActivationFailed() 
     } 
    } catch { 
     scanningActivationFailed() 
    } 
} 

et

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "adjustingFocus" { 
     if let changed = change?[NSKeyValueChangeKey.newKey] as? Bool { 
      animateFocus(animate: changed) 
     } 
    }else 
    { 
     print(keyPath) 
    } 
} 
+0

Vous devez fournir une liste de codes plus complète et une description de ce qui se passe ou non. En l'état, votre question est difficile à répondre. –

Répondre

0

D'après ce que la documentation me dit, c'est simple valeur booléenne. Vous devriez être averti chaque fois que cela change, vous devriez donc recevoir des notifications si elles sont vraies ou fausses. Observez-vous réellement les valeurs (il ne suffit pas simplement de vous ajouter en tant qu'observateur - vous devez également ignorer observeValue(forKeyPath:of:change:context:))?

+0

Désolé, 'observeValue (forKeyPath: de: change: context:)' semble s'appeler allright, mais pas toujours. Donc je suppose que le code fonctionne. C'est juste une question de cadre qui ne publie pas toujours l'événement. – Nam

+0

Veuillez faire ce que j'ai demandé ci-dessus: éditez votre question et publiez votre code complet. Aussi quelques détails de débogage (quelles valeurs sont passées dans 'observer ...', sont-ils toujours différents, y a-t-il des patterns pour les 'parfois', ...). Sans cela, nous ne pouvons que deviner, ce qui est une perte de temps pour tout le monde, y compris le vôtre. Aidez-nous à vous aider. –