2010-01-17 21 views
15

me he dado cuenta de que en OS 3.1 se puede añadir una vista superpuesta a la imagen con selectorvista de superposición de cámara, solo para una vista previa?

cameraOverlayView 

Sin embargo, también me he dado cuenta de que la adición de una vista a través de este método también muestra la vista durante todo el tiempo aparece UIImagePicker, cuando solo quiero mostrarlo durante la etapa de vista previa.

¿Hay alguna manera de hacer que esto solo suceda durante la vista previa? No quiero que esté allí durante la animación del obturador abierto, o la pantalla que pregunta si desea usar la imagen o volver a tomarla.

+2

¡Hola, mac_55! Solo quería recordarle amablemente que acepte/comente mi respuesta actualizada. –

Respuesta

17

que he descubierto una manera para que usted pueda lograr el resultado deseado a pesar de que es un poco ... no tan estándar. :)

La idea es reorganizar un poco el orden de las vistas interiores en los usos de la estructura UIImagePickerController.

Bien, entonces creamos un objeto UIImagePickerController, lo inicializa y le agrega una vista de superposición. ¡Podría tener tu atención, por favor! El objeto UIView (UIImageView en el código de ejemplo) está oculto desde el principio. No te pierdas eso. Finalmente presentamos el controlador de selector de imagen como controlador de vista modal. Este código debe estar en algún lugar de su applicationDidFinishLaunching:, viewWillAppear: o métodos similares apropiados para el lanzamiento.

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]; 

Antes de la vista de superposición (anImageView) se dio a conocer un NSTimer se crea, inicializado con anImageView (NSTimeruserInfo propiedad) y programado de inmediato. Aquí está el método que llama:

- (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]; 
    } 
} 

Se añade el conjunto NSTimer cosa para el flujo para asegurar que el trabajo de reordenamiento en torno sucederá exactamente cuando el UIImagePickerController será totalmente preparado para eso.

Esto es todo. Funciona, no es estándar, es rudo y rápido. De nuevo, siéntete libre de optimizar y hacerlo más 'adecuado' (por favor, mi objetivo era mostrarte el camino).

+0

Estaba pensando en configurar la vista para que se visualice después de que se haya ejecutado un temporizador, sin embargo, no estaba seguro de si la cámara siempre tarda el mismo tiempo de carga, ¿no depende de cuánta memoria está en uso en ese momento? y en qué dispositivo se está ejecutando? p.ej. se cargará más rápido en un 3GS que en un 3G. –

+0

Hola, mac_55, he optimizado mi solución, ahora funciona perfecto (tan perfecto como una solución alternativa). :) HTH –

+0

Disculpe la demora. Aún no llegué a probar esto, pero me complace marcarlo como la respuesta. :) –

-2

Cuando construye el selector, agregue la plantilla al selector (picker.cameraOverlayView = myView).

La superposición no estará en la imagen tomada. Es solo, como dice, una vista de superposición.

se puede quitar la vista de recubrimiento antes de tomar una fotografía (takePicture método) y añadir la vista de nuevo en imagePickerController:didFinishPickingMediaWithInfo:

+0

Lo siento, esto no es lo que estoy buscando. Quiero mostrar la superposición solo antes de tomar la foto. No mientras el obturador de la cámara está animando, o mientras le pregunta si le gusta la imagen que tomó –

+0

Si quita la superposición (picker.cameraOverlayView = nil) antes de llamar a tomar imagen, entonces la superposición no estará allí cuando el obturador esté animando. – diederikh

+0

Pero, ¿cómo lo muestro en la pantalla de vista previa? ¿Estoy en lo cierto al suponer que takePhoto captura todo lo que está en la pantalla de vista previa? Pero quiero mostrar la superposición en la pantalla de vista previa (antes de tomar la foto) * confuso * –

6

En realidad, yo estaba tratando de hacer lo mismo y me encontré con una mucho más simple de hacerlo a través de esta entrada del blog: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0/

Desde el UIImagePickerController puede llamar a un UINavigatorControllerDelegate, el método de abajo es llamado antes de la Imagen selector se muestra.

Aquí está el código 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]; 
} 

Espero que ayude.

18

Solo quería mostrar otra posibilidad sin el truco de la subvista. Hay notificaciones del sistema para los cambios en CameraPicker. Tampoco están documentados (como la estructura de la subvista). Entonces ellos también están sujetos a cambios. PERO los tienes.

Puede registrarse para ellos el uso de ningún nombre:

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

Tenemos algunos (selfexplaining) notificaciones interesantes aquí:

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 

Se podía usarlos, para activar sus overlayviews estado oculta o nada más.

+0

¿Crees que podrías rechazar tu aplicación por usar estos? –

+0

No, estas son solo cadenas. Esto debería funcionar. Pero aún no lo he probado. – calimarkus

+1

Probado esto, y pude cambiar mi vista previa de forma exitosa para que fuera diferente de mi vista de cámara al conectarme a la notificación "_UIImagePickerControllerUserDidCaptureItem". Me di cuenta de que ni PLCameraViewIrisAnimationWillBeginNotification ni PLCameraViewIrisAnimationDidEndNotification se activaron (estoy usando iOS 6), por lo que tuve que evitar el uso de notificaciones sobre esos eventos, como "Recorder_WillCapturePhoto" y "PLCameraControllerPreviewStartedNotification". – Christian

Cuestiones relacionadas