10

写真の撮影をシミュレートするAVFoundationアプリ(カメラアプリなど)があります。通常、以下は私にとってはうまくいきますが、この場合はそうではありません。

このコードは、ViewControllerのアクション内で実行されます。これには、AVCaptureVideoPreviewLayerがアタッチされた単一のフルスクリーンUIView(videoPreviewLayer)が含まれています。アニメーションは実行されますが、何も表示されません。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秒後に表示されるようです。また、コードを1回呼び出しても、2回連続して実行されることも確認しました。

4

2 に答える 2

5

私の問題は、「フラッシュ」コードがAVFoundationコールバックから呼び出されていたことでした。コールバックはメインスレッドで実行されていなかったため、UIコードは正しく実行されませんでした。その解決策は、次のようなことを行うことでした。

dispatch_async(dispatch_get_main_queue(), ^{ /* execute flash code */ });
于 2012-10-17T15:29:39.090 に答える
5

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()
})
于 2016-11-17T11:05:58.593 に答える