Имитация вспышки экрана" снимок сделан"

у меня есть приложение 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 секунд после его запуска. Я также видел, как это происходит дважды подряд, хотя я вызываю код один раз.

2 ответов


моя проблема заключалась в том, что код" flash " вызывался из обратного вызова AV Foundation. Обратный вызов не выполнялся в основном потоке, поэтому любой код пользовательского интерфейса не выполнялся бы правильно. Это решение состояло в том, чтобы сделать что-то вроде этого:

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

ваш код как 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()
})