Симулирайте светкавица на заснетия екран

Имам приложение AV Foundation, което симулира правене на снимка (като приложението за камера). Обикновено следното работи за мен, но не е в този случай.

Този код се изпълнява в рамките на действие в моя контролер за изглед. Той съдържа един UIView на цял екран (videoPreviewLayer), който има прикачен AVCaptureVideoPreviewLayer. Анимацията се изпълнява, но нищо не се показва. Имайте предвид също, че използвам 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];
             }
 ];

Ето как прикачвам 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]];

ЗАБЕЛЕЖКА След по-нататъшно изследване светкавицата се появява, макар и периодично. Обикновено изглежда, че става видимо около 5-10 секунди след като трябва да започне. Виждал съм също така да се изпълнява два пъти в бърза последователност, въпреки че извиквам кода веднъж.


person RobertJoseph    schedule 16.10.2012    source източник


Отговори (2)


Проблемът ми беше, че "флаш" кодът се извикваше от обратно извикване на AV Foundation. Обратното извикване не се изпълняваше в основната нишка, поради което всеки потребителски код нямаше да се изпълни правилно. Това решение беше да се направи нещо подобно:

dispatch_async(dispatch_get_main_queue(), ^{ /* execute flash code */ });
person RobertJoseph    schedule 17.10.2012

вашият код е 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()
})
person neoneye    schedule 17.11.2016