2010-05-21 8 views
14

escribí código simple para probar UIImagePickerController:"Uso de la animación de rotación de dos etapas", advirtiendo con UIImagePickerController

@implementation ProfileEditViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    photoTaker_ = [[UIImagePickerController alloc] init]; 
    photoTaker_.delegate = self; 
    photoTaker_.sourceType = UIImagePickerControllerSourceTypeCamera; 
    photoTaker_.showsCameraControls = NO; 
} 

- (void)viewDidAppear: (BOOL)animated { 
    [self presentModalViewController: photoTaker_ animated: NO]; 
} 

@end 

Y estoy advertencias extrañas como la siguiente:

2010-05 -20 17: 53: 13.838 TestProj [2814: 307] Usando la animación de rotación de dos etapas. Para utilizar la animación más uniforme de una etapa, esta aplicación debe eliminar las implementaciones de métodos de dos etapas. 2010-05-20 17: 53: 13.849 TestProj [2814: 307] El uso de dos etapas animación rotación no se admite cuando se gira más de una vista controladores de controlador o ver no el delegado ventana

tiene alguna idea de lo ¿esto es sobre? ¡Muchas gracias por adelantado!

+0

El bounty es encontrar una solución utilizando apis públicas. –

+0

Para ser más específicos, una solución a las advertencias de rotación de dos etapas presentadas al usar UIImagePickerController. –

+0

aclaración: la intención es la diapositiva completa de la funcionalidad sin la molesta advertencia –

Respuesta

0

Bueno, usted está presentando UIImagePickerController modalmente dentro de viewDidAppear de ProfileEditViewController.

Piense en esto. Eso significa que cuando aparece la vista ProfileEditViewController, aparece el UIImagePickerController, digamos después descarta UIImagePickerController y vuelve a ProfileEditViewController, luego se llama de nuevo a viewDidAppear y aparece UIImagePickerController, digamos después descarta UIImagePickerController y vuelve a ProfileEditViewController, luego se llama de nuevo a viewDidAppear y ... entiendes la idea.

Sin embargo, esa advertencia es bastante críptica, no estoy seguro si eso es lo que está tratando de decirte. Sugeriría hacer un botón en algún lugar del ProfileEditViewController que llama a presentModalViewController y también asegurarme de que tiene una forma de descartar el UIImagePickerController (nunca lo he usado, no estoy seguro si tiene uno automáticamente).

+0

Gracias por la respuesta. Entiendo tu punto y corregiré el código correctamente, pero esas advertencias no se deben a eso. Creo que está relacionado con el cambio de orientación en dos pasos del controlador de vista, pero no puedo resolver cómo deshacerme de ellos. – Kay

+0

Sí, creo que el código que publicaste podría no estar relacionado con esa advertencia; si aún no has visto esta pregunta, podría ser útil. http://stackoverflow.com/questions/2048781/single-stage-vs-two-stage-animation-for-iphone-apps – Tom

-1

Creo que la advertencia aquí es sobre el rendimiento de Core Animation. Como prueba, cargué el selector de imágenes sin ninguna hoja de acción u otras animaciones y las advertencias siguen allí. Creo que estas son advertencias provenientes de la propia clase de selector de imágenes y no de un mal uso de la API.

0

Puede estar tratando de presentar dos controladores de vista modal al mismo tiempo, y están luchando por recursos de animación.

1) Raramente hay una razón de UI para hacer esto. En su lugar, puede ir directamente al segundo controlador de vista (el selector de imágenes); y, después de descartarlo, presentar la primera vista o ver el controlador.

2) Si quiere dos controladores de vista apiladas o un controlador de vista en la parte superior de una vista, a continuación, establecer un temporizador en viewDidAppear para presentar el segundo controlador de vista después de que la primera haya terminado su animación. (Se podría mostrar una imagen PNG de relleno de un selector en blanco en la primera de ellas para evitar demasiada pantalla intermitente hasta que el segundo controlador de vista va en vivo.)

EDITAR - Se ha añadido un ejemplo de código aleatorio:

probaría Sustituyendo esto como un experimento:

- (void)foo { 
    [self presentModalViewController: photoTaker_ animated: NO]; 
} 

- (void)viewDidAppear: (BOOL)animated { 
    NSTimer *bar = [ NSTimer scheduledTimerWithTimeInterval: (2.0f) 
          target: self 
          selector: @selector(foo) 
          userInfo: nil 
          repeats:NO ]; 
} 

Un retraso de tiempo más corto puede funcionar también.

+0

Esta publicación se refiere específicamente a UIImagePickerController, que parece que siempre causa esta advertencia. Proporcione un ejemplo práctico de UIImagePickerController que evite la advertencia en iOS 4.1 y le otorgaré la recompensa. –

1

Quizás esté agregando la vista raíz UIViewController como una subvista de la ventana en lugar de asignar el controlador de vista a la propiedad de la ventana rootController?

+0

Funciona solo porque no anima. Cualquier método que evite la animación evitará la advertencia, pero la intención es la funcionalidad de diapositiva completa sin la molesta advertencia. Tal vez Windows sea la respuesta de alguna manera. –

+0

De acuerdo, funciona si creo una nueva ventana, agrego el selector como el controlador raízView de esa ventana, y luego animar dentro de esa ventana. Estoy agregando una respuesta para ese efecto. ¡Te daré la recompensa ya que desencadenaste la idea que condujo a una solución! –

11

Este mensaje aparecerá si presenta el UIImagePickerController dentro de otro UIViewController. Debido a que no se empuja como una pila UINavigationController, hay confusión en el nivel UIWindow. No sé si la advertencia es un problema, pero para eliminar la advertencia que puede hacer lo siguiente:

// self = a UIViewController 
// 

- (void) showCamera 
{ 
    cameraView = [[UIImagePickerController alloc] init]; 
    [[[UIApplication sharedApplication] keyWindow] setRootViewController:cameraView]; 
    [self presentModalViewController:cameraView animated:NO]; 
} 

- (void) removeCamera 
{ 
    [[[UIApplication sharedApplication] keyWindow] setRootViewController:self]; 
    [self dismissModalViewControllerAnimated:NO]; 
    [cameraView release]; 
} 
+0

Gracias John Carter .. Esto funciona ...! – GeneCode

+0

He estado luchando contra un problema muy extraño con las animaciones al agregar y quitar UINavigationControllers, pero solo después de mostrar UIImagePickerController y esto fue lo que hizo. ¡Gracias! – Adolfo

+0

-John Carter- se elimina la advertencia, pero la interfaz se detiene durante 5 a 10 segundos cuando intento seleccionar una imagen de la biblioteca o tomar una nueva imagen (este comportamiento es por primera vez cuando la aplicación está instalada en el dispositivo y el selector está a la apertura), ¿puede decirme cómo solucionar este retraso? –

1

TODO cae de nuevo en la IU

Esta advertencia se puede implementar de varias diferentes objetos: selectores, teclado, etc.

He encontrado que está relacionado con la interfaz de usuario dando dos pasos para completar una transición u otra animación. O para cualquier instancia donde la interfaz de usuario esté tratando de terminar una cosa y se le pida que ejecute otra antes de que haya terminado. (por lo tanto, abarca una amplia gama de activadores posibles)

He visto la advertencia en 4.0 & 4.2. En mi caso, estaba trabajando con la rotación del dispositivo y la captura de si el teclado aún estaba arriba (es decir, el campo de texto seguía siendo el primero en responder). Si es así, el teclado debe mantenerse entre las vistas, pero esto presenta otras complicaciones con otras vistas.

Por lo tanto, implementé un rastreador BOOL para realizar un seguimiento si keybaordIsPresent, y si es así, {textfield resignFirstResponder]; al detectar el cambio de orientación y restablecer el campo de texto para convertirse en FristResponder después de la transición que estaba envuelta en un bloque de animación. Mi seguidor BOOL funcionó mejor, todavía utilizo las NSNotifications para el teclado, pero hubo superposiciones de notificaciones durante las rotaciones porque el teclado se descartaba sin solicitarlo. El BOOL se establece en NO en Load, y cuando [textfield resignFirstResponder]; está implementado. * no cuando "- (void) keyboardWillhide es desencadenado por NSNotifications, lo que me da desencadenantes de trabajo que nunca entran en conflicto. BOOL se establece en SÍ, solo cuando el usuario toca el campo de texto que activa automáticamente becomeFirstResponder.

Eliminé advertencia mediante la adopción de la [textfild resignFirstResponder]; fuera de la

-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
//if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];} 

} y colocarlo de nuevo en la parte superior del código para el:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 

if (keyboardIsPresent == YES) { 
    [self.entryTextField resignFirstResponder]; 
} 

//Determine Which Orientation is Present: 
if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)){ 
    //LANDSCAPE VIEW: 
    [self configureLandscapeView]; 
}else { 
    //PORTRAIT VIEW: 
    [self configurePortraitView]; 
} 

}


** Aunque no tenía ningún código dentro del - (void) willnimatFirstHalfOfRotationToInterface :, la advertencia aún estaba apareciendo. Creo que la advertencia aún estaba apareciendo porque el compilador todavía tiene que intentar el método mientras intenta ejecutar la primera animación y, por lo tanto, obtiene la llamada de animación doble o la superposición de recursos. No sabe que no hay un código ejecutable con el método hasta después de que se ejecuta. Y para ese momento ya reservó recursos en preparación para manejar posibles acciones dentro del método.
** Para elimitar la advertencia, tuve que eliminar o anular el código de willAnimateFirstHalfOfRotation, de modo que el compilador ni siquiera tiene que verificar si hay una posible segunda animación o acción que deba ejecutarse en al mismo tiempo.

/*-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
//if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];}}*/ 

Después de que se complete la transición, dentro del bloque de animación original puedo comprobar para ver si el "keyboardIsPresent" era sí antes de la rotación, y si es así, renunciar a la primera respuesta una vez más.Yo uso setAnimationDuration:0.3 que sale bastante limpio y no nervioso.

0

Acabo de tener el mismo problema. En mi caso fue un error tonto que estoy poniendo aquí en caso de que alguien más se encuentre con el mismo problema.

En mi aplicación con pestañas elimino uno de los ViewControllers originales y agregué uno nuevo con Storyboard para crear una sección de "Configuración".

Este nuevo VC tenía que ser un VC de vista de tabla e incluso lo diseñé, compilé y ejecuté sin problemas, cuando cambié la orientación de la aplicación seguí obteniendo el error "Uso de la animación de rotación de dos etapas".

Mi problema es que olvidé cambiar en la interfaz de archivo original .h "UIViewController" para "UITableViewController".

Una vez hecho esto, cambié en el distintivo de identidad Storyboard la clase del valor general a mi SettingsViewController y eso fue todo.

Espero que pueda ayudar a alguien más. Me tomó un tiempo llegar al fondo de esto.

Cheers,

Cuestiones relacionadas