2012-10-16 14 views
9

Ho un'app AV Foundation che simula scattare una foto (come l'app della fotocamera). Normalmente il seguente funziona per me, ma non è in questo caso.Simulare uno schermo "foto scattata" flash

Questo codice viene eseguito all'interno di un'azione nel mio controller di visualizzazione. Contiene un singolo UIView a schermo intero (videoPreviewLayer) a cui è associato AVCaptureVideoPreviewLayer. L'animazione viene eseguita ma non viene visualizzato nulla. Nota anche che sto usando ARC, iOS 6, iPhone 4S, iPad3.

// Flash the screen white and fade it out 
UIView *flashView = [[UIView alloc] initWithFrame:[[self videoPreviewView] frame]]; 
[flashView setBackgroundColor:[UIColor whiteColor]]; 
[[[self view] window] addSubview:flashView]; 

[UIView animateWithDuration:1.f 
      animations:^{ 
       [flashView setAlpha:0.f]; 
      } 
      completion:^(BOOL finished){ 
       [flashView removeFromSuperview]; 
      } 
]; 

Ecco come Attribuisco l'AVCaptureVideoPreviewLayer:

// Setup our preview layer so that we can display video from the camera 
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 

CALayer *viewLayer = videoPreviewView.layer; 
viewLayer.masksToBounds = YES; 

captureVideoPreviewLayer.frame = videoPreviewView.bounds; 

[viewLayer insertSublayer:captureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]]; 

NOTA Dopo ulteriori indagini, il flash è in corso, anche se in modo intermittente. Generalmente sembra essere visibile circa 5-10 secondi dopo che dovrebbe iniziare. Ho anche visto accadere eseguire due volte in rapida successione anche se chiamo il codice una volta.

risposta

4

Il mio problema era che il codice "flash" veniva chiamato da un callback di AV Foundation. Il callback non era in esecuzione sul thread principale quindi nessun codice UI sarebbe stato eseguito correttamente. Tale soluzione era quella di fare qualcosa di simile:

dispatch_async(dispatch_get_main_queue(), ^{ /* execute flash code */ }); 
4

il codice come swift3

let shutterView = UIView(frame: cameraView.frame) 
shutterView.backgroundColor = UIColor.black 
view.addSubview(shutterView) 
UIView.animate(withDuration: 0.3, animations: { 
    shutterView.alpha = 0 
}, completion: { (_) in 
    shutterView.removeFromSuperview() 
}) 
Problemi correlati