2016-11-22 5 views
1

J'ai un contrôleur de vue basé sur AVCam, et j'ai ajouté un UIButton pour basculer la lumière de la torche. Voici le code qui effectue cela:Comment savoir quand la torche AVCaptureDevice s'éteint?

- (IBAction)toggleTorchLight:(id)sender { 
// See: http://stackoverflow.com/questions/11726543/how-to-turn-flashlight-on-off-using-one-button 
AVCaptureDevice *flashLight = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
if ([flashLight isTorchAvailable] && [flashLight isTorchModeSupported:AVCaptureTorchModeOn]){ 
    if ([flashLight lockForConfiguration:nil]){ 
     if ([flashLight isTorchActive]) { 
      [flashLight setTorchMode:AVCaptureTorchModeOff]; 
      [(UIButton *)sender setTintColor:[UIColor blackColor]]; 
     } 
     else { 
      [flashLight setTorchMode:AVCaptureTorchModeOn]; 
      [(UIButton *)sender setTintColor:[UIColor yellowColor]]; 
     } 
     [flashLight unlockForConfiguration]; 
    } 
} 

Vous remarquerez que je tourne le bouton jaune lorsque la lumière est allumée. Le problème est que la lumière de la torche s'éteint également lorsque l'application est envoyée en arrière-plan, lorsque le contrôleur de vue change, lorsqu'un contrôleur de vue d'alerte est présenté, etc. Ces événements éteignent la torche, mais je dois aussi noir encore. Au lieu d'activer le bouton noir pour chacun de ces scénarios, y a-t-il un moyen simple, comme recevoir une notification lorsque la lumière s'éteint? J'ai essayé AVCaptureDeviceWasDisconnectedNotification, en remplaçant becomeFirstResponder et viewDidDisappear, aucun d'entre eux a travaillé.

Des suggestions?

+0

Avez-vous essayé d'envoyer votre propre notification en utilisant les états AppDelegate? 'applicationWillResignActive' par exemple – Nathaniel

+0

Vous pouvez utiliser KVO pour observer' torchActive'. –

+0

@RhythmicFistman KVO a parfaitement fonctionné! Utilisé [this] (http://stackoverflow.com/questions/28489223/torchlevel-kvo-ios) comme guide –

Répondre

1

d'abord définir une adresse de contexte:

static void * TorchActiveContext = &TorchActiveContext; 

Puis, dans la méthode addObservers:

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
[videoDevice addObserver:self forKeyPath:@"torchActive" options:NSKeyValueObservingOptionNew context:TorchActiveContext]; 

Dans la méthode removeObservers:

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
[videoDevice removeObserver:self forKeyPath:@"torchActive" context:TorchActiveContext]; 

Dans observeValueForKeyPath

if (context == TorchActiveContext) { 
    UIColor *color = ((AVCaptureDevice*)object).torchActive ? [UIColor yellowColor] : [UIColor blackColor]; 
    [self.torchLightButton setTintColor:color]; 
}