2016-05-18 1 views
1

Je suis en train de créer une application pour appareil photo et j'essaie d'exposer la durée d'exposition actuelle à l'utilisateur. Comme cette valeur change constamment jusqu'à ce qu'elle soit définie manuellement, je dois utiliser kvo pour transmettre les valeurs à l'utilisateur. Je l'ai fait avec succès avec le ISO, et peut observer les changements au exposureDuration, mais ne peut pas contraindre la nouvelle valeur à un objet CMTime (qui est ce que exposureDuration est). Voici le code que je utilise pour essayer de réaliser ceci:Valeur clé observant l'expositionDurée

override init() { 
    super.init() 

    captureDevice = self.selectCamera() 

    captureDevice?.addObserver(self, forKeyPath: "ISO", options: .New, context: &isoContext) 
    captureDevice?.addObserver(self, forKeyPath: "exposureDuration", options: .New, context: &shutterContext) 
} 

deinit { 
    captureDevice?.removeObserver(self, forKeyPath: "ISO") 
    captureDevice?.removeObserver(self, forKeyPath: "exposureDuration") 
} 

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    let newValue = change?[NSKeyValueChangeNewKey] 

    if context == &isoContext { 
    store.iso.value = newValue as! Float 
    } else if context == &shutterContext { 
    // The app crashes at this line. 
    // Thread 1: EXC_BREAKPOINT (code=1, subcode=0x100091670) 
    // newValue is "AnyObject" in the debug area 
    store.shutterSpeed.value = newValue as! CMTime 
    } 
} 

que je fais quelque chose de mal, ou est-ce un bug légitime que je dois déposer à la pomme?

+0

Comment l'avez-vous fait pour ISO? – Nil

+0

@Nil Vous pouvez le voir dans l'exemple, mais KVO normal fonctionne comme prévu. – Mike

Répondre

0

La valeur newValue de exposureDuration n'est pas CMTime, mais NSValue. Il s'agit d'un code fixe (swift3).

store.shutterSpeed.value = (newValue as! NSValue).timeValue