5

Devo visualizzare overlay immagine (frame) su AVCaptureVideoPreviewLayer. Come posso fare questo?Come visualizzare overlay su AVCaptureVideoPreviewLayer

-(void) viewDidAppear:(BOOL)animated 
{ 
    AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    session.sessionPreset = AVCaptureSessionPresetPhoto; 
    [session commitConfiguration]; 

    CALayer *viewLayer = self.vImagePreview.layer; 
    NSLog(@"viewLayer = %@", viewLayer); 

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 

    captureVideoPreviewLayer.frame = self.vImagePreview.bounds; 
    [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
    if (!input) { 
     // Handle the error appropriately. 
     NSLog(@"ERROR: trying to open camera: %@", error); 
    } 
    [session addInput:input]; 

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

    [session addOutput:_stillImageOutput]; 

    [session startRunning]; 

} 

L'aggiunta di una nuova vista sul livello di uscita del video non funziona. Il livello di anteprima appare sopra tutte le viste.

mio punto di vista della gerarchia:

  • MainView
    • OverlayView
    • VideoOutputView

My frame appears under the video output view

risposta

-5

Risolto creando tutte le viste a livello di programmazione (senza storyboard)

+0

ti dispiace condividere il tuo codice per la risposta? –

3

L'ho capito. Il trucco consisteva nell'avere la visualizzazione della scansione video come se fosse una vista privata senza nulla al suo interno (nessuna visualizzazione parziale) e quindi aggiungere le sovrapposizioni come visualizzazioni di pari livello (anziché come viste secondarie).

Questa soluzione funziona all'interno di Interface Builder senza dover ricorrere alla creazione a livello di codice delle viste.

0

Attualmente utilizzando iOS 8.4 e Xcode 6.4

Ha funzionato per me di aggiungere due sottolivelli a self.view, sia aggiunto nella storyboard. nella struttura del documento mi hanno ora: (ordine è fondamentale - purtroppo il punto di vista più bassi sono disegnate in cima alle vedute sopra di loro - non confondendo affatto Assicurarsi overlayView non è opaca.)

View 
    previewView 
    overlayView 

ho continuato a punti ad entrambi subviews nel mio codice in modo da poter aggiungere il AVCaptureVideoPreviewLayer direttamente come substrato di previewView e impostare il datasource della mia overlayView

per overlayView ho fatto una sottoclasse personalizzata di UIView così ho potuto implementare drawRect:

In drawRect: Sono stato in grado di disegnare rettangoli attorno ai codici a barre catturati identificati nel mio AVCaptureSession mentre era ancora in esecuzione e mostra l'anteprima.

5

Anche se questa domanda è stata posta N anni fa, vorrei condividere la mia risposta esatta. Dopo pochi minuti, sono stato in grado di comprendere quello che ha detto Gujamin. In effetti, la soluzione può essere programmata. Ma se stai facendo in XIB o Storyboard, controlla questo tipo di gerarchia. Non inserire alcuna visualizzazione secondaria su CameraPreviewView (la visione d'insieme di cui il suo livello sarà la fotocamera).

enter image description here

Problemi correlati