5

Potrzebuję wyświetlić nakładkę obrazu (ramki) nad AVCaptureVideoPreviewLayer. Jak mogę to zrobić?Jak wyświetlić nakładkę ponad 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]; 

} 

Dodanie nowego widoku do warstwy wyjściowej wideo nie działa. Warstwa podglądu pojawia się na górze wszystkich widoków.

Moim zdaniem hierarchia:

  • MAINVIEW
    • wyświetlanie nakładki
    • VideoOutputView

My frame appears under the video output view

Odpowiedz

-5

Rozwiązano przez programowe utworzenie wszystkich widoków (bez scenorysu)

+0

Ci przeszkadza dzielenie kodu na odpowiedź? –

3

Wyjaśniałem to. Sztuczka polegała na tym, aby widok skanowania wideo miał swój własny widok i nie zawierał niczego wewnątrz (brak subskrybcji), a następnie dodawał nakładki jako widoki widoku rodzica (zamiast widoków podrzędnych).

To rozwiązanie działa w programie Interface Builder bez konieczności uciekania się do programowego tworzenia widoków.

0

Obecnie użyciu iOS 8.4 i Xcode 6.4

Udało mi się dodać dwie podwarstwy do self.view zarówno dodany w serii ujęć. W zarysie dokumentu Mam teraz: (kolejność jest krytyczna - niestety niższe widoki są rysowane na wierzchu widokiem nad nimi - nie mylące w ogóle Upewnij overlayView nie jest nieprzejrzysty.)

View 
    previewView 
    overlayView 

Ciągle wyloty do obu subviews w moim kodu, więc mogę dodać AVCaptureVideoPreviewLayer bezpośrednio jako podwarstwy z previewView i ustawić datasource z moim overlayView

dla overlayView zrobiłem zwyczaj podklasa UIView więc mogłem realizować drawRect:

W udało mi się narysować prostokąty wokół przechwyconych kodów paskowych zidentyfikowanych w moim AVCaptureSession, gdy był on wciąż uruchomiony i pokazywał podgląd.

5

Mimo że pytanie to zadano N lata temu, chciałbym podzielić się moją dokładną odpowiedzią. Po kilku minutach mogłem zrozumieć, co powiedział Gujamin. Rzeczywiście, rozwiązanie można zrobić programowo. Ale jeśli robisz to w XIB lub Storyboard, sprawdź ten rodzaj hierarchii. Nie umieszczaj żadnych podobieństw w swoim CameraPreviewView (uiview, którego warstwa będzie kamerą).

enter image description here

Powiązane problemy