2010-01-17 13 views
15

Ho notato che in OS 3.1 è possibile aggiungere una vista sovrapposizione per il selettore di immagini convisualizzazione sovrapposizione videocamera - solo per l'anteprima?

cameraOverlayView 

Tuttavia, ho anche notato che l'aggiunta di una vista tramite questo metodo visualizza anche la vista per tutto il tempo viene visualizzato UIImagePicker, quando voglio mostrarlo solo durante la fase di anteprima.

C'è un modo per farlo solo durante l'anteprima? Non voglio che sia presente durante l'animazione dell'otturatore aperto o sullo schermo che chiede se si desidera utilizzare l'immagine o riprendere.

+2

Ehi mac_55! Volevo semplicemente ricordarti gentilmente di accettare/commentare la mia risposta aggiornata. –

risposta

17

ho trovato un modo per voi per ottenere il risultato desiderato anche se è un po '... non così standard. :)

L'idea è di riorganizzare un po 'l'ordine delle viste interne negli usi della struttura UIImagePickerController.

OK, quindi creiamo un oggetto UIImagePickerController, inizializzalo e aggiungiamoci una vista di sovrapposizione. Posso avere la vostra attenzione per favore! L'oggetto UIView (UIImageView nel codice di esempio) è nascosto fin dall'inizio. Da non perdere. Infine presentiamo il controller di selezione delle immagini come controller di visualizzazione modale. Questo codice dovrebbe trovarsi da qualche parte nel tuo applicationDidFinishLaunching:, viewWillAppear: o simile appropriato per avviare i metodi.

UIImagePickerController *anImagePickerController = [UIImagePickerController new]; 
anImagePickerController.delegate = self; 
anImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 

UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]]; 
anImageView.frame = CGRectMake(0, 1, anImageView.image.size.width, anImageView.image.size.height); 
anImageView.hidden = YES; 
anImagePickerController.cameraOverlayView = anImageView; 

[viewController presentModalViewController:anImagePickerController animated:NO]; 
[anImagePickerController release]; 

[NSTimer scheduledTimerWithTimeInterval:0.1 
           target:self 
           selector:@selector(timerFireMethod:) 
           userInfo:anImageView 
           repeats:YES]; 
[anImageView release]; 

prima che la vista di sovrapposizione (anImageView) viene rilasciato un NSTimer viene creato, inizializzato con anImageView (NSTimeruserInfo proprietà) e in programma subito. Ecco il metodo si chiama:

- (void)timerFireMethod:(NSTimer*)theTimer { 
    UIView *cameraOverlayView = (UIView *)theTimer.userInfo; 
    UIView *previewView = cameraOverlayView.superview.superview; 

    if (previewView != nil) { 
     [cameraOverlayView removeFromSuperview]; 
     [previewView insertSubview:cameraOverlayView atIndex:1]; 

     cameraOverlayView.hidden = NO; 

     [theTimer invalidate]; 
    } 
} 

Il tutto NSTimer cosa viene aggiunto al flusso al fine di garantire che il lavoro di riordino intorno accadrà esattamente quando il UIImagePickerController sarà del tutto pronto per questo.

Questo è tutto. Funziona, non è standard, è ruvido e veloce. Di nuovo sentiti libero di ottimizzarlo e renderlo 'più raro' (oh per favore, il mio obiettivo era quello di mostrarti la via).

+0

Stavo pensando di impostare la visualizzazione da visualizzare dopo l'esecuzione di un timer, tuttavia non ero sicuro che la fotocamera impiegasse sempre lo stesso tempo di caricamento, non dipende da quanta memoria è in uso al momento e su quale dispositivo sta girando? per esempio. caricherà più velocemente su un 3GS che su un 3G. –

+0

Ehi mac_55, ho ottimizzato la mia soluzione - ora funziona perfettamente (come può funzionare una soluzione che risolve il problema). :) HTH –

+0

Ci scusiamo per il ritardo. Non ho ancora avuto modo di provarlo, ma sono felice di segnarlo come risposta. :) –

-2

Quando si crea il selettore, aggiungere l'overlay al selettore (picker.cameraOverlayView = myView).

L'overlay non sarà nella foto scattata. È solo, come dice, una vista sovrapposta.

è possibile rimuovere la vista sovrapposizione prima di scattare una foto (takePicture metodo) e aggiungere la vista di nuovo in imagePickerController:didFinishPickingMediaWithInfo:

+0

Siamo spiacenti, questo non è quello che sto cercando. Voglio visualizzare la sovrapposizione solo prima di scattare la foto. Non mentre l'otturatore della fotocamera sta animando, o mentre ti sta chiedendo se ti piace l'immagine che hai scattato –

+0

Se rimuovi l'overlay (picker.cameraOverlayView = nil) prima di chiamare takePicture, la sovrapposizione non sarà lì quando l'otturatore sta animando. – diederikh

+0

Ma come posso visualizzarlo sulla schermata di anteprima? Ho ragione nell'assumere che takePhoto catturi tutto ciò che si trova nella schermata di anteprima? Ma voglio visualizzare l'overlay sulla schermata di anteprima (prima che la foto sia scattata) * confuso * –

6

In realtà, io stavo cercando di fare la stessa cosa e mi sono imbattuto in una molto più semplice di farlo tramite questo post del blog: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0/

Dal momento che l'UIImagePickerController può chiamare un UINavigatorControllerDelegate, il seguente metodo viene chiamato prima che l'immagine picker viene visualizzato.

Ecco il codice importante:

- (void)navigationController:(UINavigationController *)navigationController 
willShowViewController:(UIViewController *)viewController 
animated:(BOOL)animated 
{ 
    if (!viewController) 
    return; 

    UIView* controllerViewHolder = viewController.view; 
    UIView* controllerCameraView = [[controllerViewHolder subviews] objectAtIndex:0]; 
    UIView* controllerPreview = [[controllerCameraView subviews] objectAtIndex:0]; 
    [controllerCameraView insertSubview:self.overlayView aboveSubview:controllerPreview]; 
} 

Speranza che aiuta.

18

Volevo solo mostrare un'altra possibilità senza subview giocherellare. Ci sono notifiche di sistema per le modifiche in CameraPicker. Non sono nemmeno documentati (come la struttura subview). Quindi sono anche soggetti a modifiche. MA li prendi.

È possibile registrarsi utilizzando nessun nome:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil]; 

Riceviamo alcuni interessanti (selfexplaining) notifiche qui:

PLCameraControllerPreviewStartedNotification 
PLCameraViewIrisAnimationWillBeginNotification 
PLCameraViewIrisAnimationDidEndNotification 

Recorder_DidStartPreviewing 
Recorder_SourceStarted 
Recorder_WillCapturePhoto 
Recorder_DidCapturePhoto 
Recorder_PhotoStillImageSampleBufferReady 
Recorder_DidStopPreviewing 

_UIImagePickerControllerUserDidCaptureItem // Photo was taken, preview is shown 
_UIImagePickerControllerUserDidRejectItem // Repeat was pressed, camera is shown again 

Tu li potrebbe utilizzare, per attivare i tuoi overlayviews stato nascosto o niente altro.

+0

Pensi di poter rifiutare la tua app per l'utilizzo di questi? –

+0

No, queste sono solo stringhe. Questo dovrebbe funzionare. Ma non l'ho ancora provato. – calimarkus

+1

Provato questo, e sono riuscito a modificare la mia anteprima in modo che fosse diverso dalla mia vista della fotocamera agganciando la notifica "_UIImagePickerControllerUserDidCaptureItem". Ho notato che né PLCameraViewIrisAnimationWillBeginNotification né PLCameraViewIrisAnimationDidEndNotification sono stati attivati ​​(sto usando iOS 6), quindi ho dovuto risolvere il problema utilizzando le notifiche su quegli eventi, come "Recorder_WillCapturePhoto" e "PLCameraControllerPreviewStartedNotification". – Christian

Problemi correlati