2012-06-04 40 views
5

Saatin% 90'ında iyi çalışan bir kamera önizleme pencerem var. Ancak, bazen arka plandaysa uygulamama döndüğümüzde önizleme görüntülenmez. Bu görüş yükler zaman diyoruz kodudur:AVCaptureSession, arkadan dönerken başarısız oluyor

- (void) startCamera { 

session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetPhoto; 

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
captureVideoPreviewLayer.frame = _cameraView.bounds; 
[_cameraView.layer addSublayer:captureVideoPreviewLayer]; 
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
captureVideoPreviewLayer.position=CGPointMake(CGRectGetMidX(_cameraView.bounds), 160); 

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
NSError *error = nil; 

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
if (!input) { 

    NSLog(@"ERROR: %@", error); 


    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Important!" 
                message:@"Unable to find a camera." 
                delegate:nil 
              cancelButtonTitle:@"Ok" 
              otherButtonTitles:nil]; 
    [alert show]; 
    [alert autorelease]; 
} 

[session addInput:input]; 

stillImage = [[AVCaptureStillImageOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG , AVVideoCodecKey, nil]; 
[stillImage setOutputSettings:outputSettings]; 

[session addOutput:stillImage]; 
[session startRunning]; 
} 

Bu olursa, benim tercihleri ​​görünümüne geçebilirsiniz ve tekrar ve arkadaşları iyi, ama ben öldürmek istiyorum can sıkıcı bir böcek. Önizleme penceresi, storyboard'umdaki bir UIView.

cevap

7

Yakalama oturumunu görünüm yüklemesinde başlatmayın, bunun yerine viewWillAppear'da başlatın ve viewWillDissapear'da durdurun.

Uygulama arka plandayken, görünüm denetleyicinizin bazı belleği temizlemiş gibi görünüyor. Yakalama oturumunuzu bu şekilde akılda tuttuğunuzdan emin olun.

Oturum açma işlemini, başlangıç ​​yönteminiz yerine, özel bir özellikli getter yöntemiyle tembelleştirin; bu şekilde bellek sızıntılarını önlersiniz.

+1

Teşekkür ederim, bunu yapacağım ve birkaç saatliğine test edeceğim :) – mrEmpty

+0

fantastik çözüm ....... –

+2

Bekle - 'viewWillAppear'/'Disappear' adlı yalnızca bir örnek değil mi sahne uygulamanızda hareket ettikçe: uygulama ön plana girip çıktığında çağrılmıyorlar mı? UIApplicationWillResignActiveNotification' için kayıt yaptırmak gerekli değil mi? [Bunun örnekleriyle QA] (http://stackoverflow.com/a/22868754/294884) – Fattie

İlgili konular