2010-10-03 14 views
27

En la aplicación de mapas oficial de Apple para el iPhone, hay un pequeño botón de 'página curva' en la esquina inferior derecha. Cuando lo presionas, el mapa en sí se despega para revelar algunas opciones. Me gustaría duplicar este efecto en mi propia aplicación.¿Cómo puedo usar UIModalTransitionStylePartialCurl en una UIView que NO ocupa toda la pantalla?

Estoy tratando de usar UIModalTransitionStylePartialCurl (Añadido en SDK 3.2). En términos de su diseño, mi aplicación se parece a la aplicación de mapas oficial de Apple casi exactamente. Puedo obtener fácilmente la pantalla ENTERA para pelar hacia atrás, revelando otra vista debajo, pero no quiero esto. Solo quiero que la vista del mapa se despegue.

Para crear este efecto, debe tener un UIViewController que realice la transición. Si configuro la vista de este UIViewController en una pequeña subvista en algún lugar de la pantalla que no ocupe toda la pantalla, puedo obtener solo esa subvista para recuperarla. ¡Eso es genial! Sin embargo, después de la segunda parte de la transición (cuando la página vuelve a su lugar), las vistas nunca están donde comenzaron. O bien la vista que se despegó se habrá movido desde su posición original, o la vista que se reveló se habrá expandido para ocupar toda la pantalla.

¿Hay algún error obvio que estoy cometiendo? ¡Realmente apreciaria cualquier ayuda!

El código que estoy usando es realmente simple. Es básicamente:

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 

[curlableMapViewController presentModalViewController:underMapViewController animated:YES]; 
+0

¿De verdad? Ninguna de las respuestas existentes resolvió su problema? [Tos con tos] Es posible que desee aceptar al menos 1 de ellos, ¡realmente ayuda a las personas a sentirse motivadas para ayudarlo! –

Respuesta

9

Desde el Documentation:

UIModalTransitionStylePartialCurl

Cuando se presenta el controlador de vista, una de las esquinas de la vista actual rizos hacia arriba para revelar el punto de vista modal debajo. En el momento del despido, la página enrollada se despliega nuevamente en la parte superior de la vista modal. Una vista modal presentada usando esta transición no puede presentar vistas modales adicionales.

Este estilo de transición sólo se admite si el controlador de vista de los padres presenta una vista de pantalla completa y se utiliza el estilo de presentación UIModalPresentationFullScreen modal. Intentar utilizar un factor de forma diferente para la vista principal o un estilo de presentación diferente desencadena una excepción.

Aunque no tengo ninguna excepción con otras presentaciones que no sean de pantalla completa. Estaba probando y tengo el mismo problema que tú. Descubrí que si la vista de ParentViewController es un ImageView y establezco el modo de contenido en UIViewContentModeCenter, la vista no cambia de tamaño ni se mueve. Tal vez haya una solución al guardar su vista actual como una imagen, ponerla en la parte superior, hacer el rizo, y después de cerrar su modal, reorganizar las cosas ocultas y eliminar la vista superior de la imagen. Sé que suena loco, pero eso es lo que probaría si realmente tuviera que cumplir ese requisito.

Espero que esto ayude, Jorge.

+0

¡Gracias! Voy a jugar con la técnica sugerida y ver si puedo encontrar algo que funcione. – caecus314

0

Encontré este problema también. Para mí, el marco de la vista principal no se rompió hasta que se desestimó la vista modal. Así que guardé el marco en caché antes de descartarlo y lo restauré justo después.

CGRect frame = controllerWithModal.view.frame; 
[controllerWithModal dismissModalViewControllerAnimated:YES]; 
controllerWithModal.view.frame = frame; 
0

Yo también tuve este problema, pero lo resolví ..(no sé si es la manera correcta, pero está funcionando)

Quería tener una vista de imagen dentro de una vista de desplazamiento, y cuando el usuario toca un botón dentro de la vista de desplazamiento quería enderezar la vista de desplazamiento y mostrar una tabla vista en ese lugar. Así que coloqué una tableview detrás ScrollView y initialy la pusieron a hidden.when el usuario pulsa el botón lo hice

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES]; 
[UIView commitAnimations]; 

después de eso frontview eliminado de la vista. Espero que ayude ..

7

¿Qué tal algo como esto:

[UIView beginAnimations:@"PartialPageCurlEffect" context:nil]; 
    [UIView setAnimationDuration:0.3]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myOldSubViewController.view cache:YES]; 

    [myOldSubViewController.view addSubview:myNewViewController.view]; 

    [UIView commitAnimations]; 

Nota: para algunas vistas si las opiniones son complejos y fuera del centro no pueden ser artefactos. Cambiando cache:YES a cache:NO puede arreglar con.

+1

Este es un efecto similar, pero no lo que el OP quería. Este código hace que la vista "vieja" se "arranque" por completo, en lugar de simplemente "pelar" un poco para revelar algo debajo (como Mapas). –

+0

Leyendo de nuevo Puedo entender lo que quiso decir. ¿Quizás uno puede abortar la animación a medio camino de alguna manera para dejarla parcialmente revelada? – Marius

5

que tenían un ligero hipo confundir

.modalTransitionStyle 

y

.modalPresentationStyle 

La primera va en el objetivo viewController, por ejemplo, la persona que desee debajo. El segundo va en el ViewController de padres, p. el que en realidad se distorsiona por el rizo. El OP lo entendió bien, pero lo entendí mal, y fue un frustrante 10 minutos antes de que me diera cuenta. Tirarlo en esta publicación en caso de que le dé a alguien más la cachetada que necesitaba.

7

Como señala cprcrack, esto no responde la pregunta original. Sin embargo, es información útil, así que con eso en mente lo dejaré aquí.

Esto es en realidad mucho más simple de lo que supondría.

Llamaremos a los controladores de vista MapViewController y SettingsViewController. Su problema es que desea pelar parte (y solo parte) de MapViewController para mostrar SettingsViewController.

Así es como se hace:

  • utilizar una vista de tamaño completo para ambos puntos de vista.
  • Sólo coloque contenido en la mitad inferior de vista SettingsViewController 's.
  • Use UIModalTransitionStylePartialCurl para hacer la transición entre ellos, como ya lo hace.

iOS detectará que has hecho esta exfoliación de forma automática y sólo MapViewController 's vista atrás lo suficiente a la mitad inferior de SettingsViewController' s vista, que es donde todo el contenido es.

Si coloca el contenido en la mitad superior de la vista de SettingsViewController, iOS lo detectará y recuperará la vista de MapViewController en su lugar.

Resumen: Coloque el contenido solo en la mitad inferior de su nueva vista. iOS lo resolverá.

(no creo que esto está documentado en cualquier lugar, lo siento.)

+0

Aunque su respuesta podría ser útil, lo que está describiendo es solo el comportamiento normal de 'UIModalTransitionStylePartialCurl'. El problema que enfrenta @ caecus318 tiene que ver con mantener una barra en la parte inferior de la vista sin ninguna animación y volver al estado original. – cprcrack

+0

Aha, la pregunta nunca tuvo sentido para mí hasta que no me lo explicaste. He modificado mi respuesta. (Es útil, así que no quiero simplemente eliminarlo.) –

0

creo que la aplicación Mapas de Apple utiliza transiciones indocumentados: mapCurl y mapUncurl. No estoy seguro de que haya alguna forma de hacer exactamente lo que caecus314 quiere (que también es el efecto que he tratado de duplicar).

UIModalTransitionStylePartialCurl se cerrarán hasta que toda la parte inferior de la primera vista, incluyendo la barra de herramientas, que es a diferencia de aplicación Mapas de Apple, que sólo se queja del mapa y deja la barra de herramientas en su lugar.

Por lo que yo sé, no hay forma de acurrucar el mapa.

+0

Por supuesto que hay una manera, de hecho, el usuario que hizo la pregunta le está diciendo el procedimiento para lograrlo. ¿Has leído la pregunta, al menos? La parte donde dice: "Puedo obtener solo esa subvista para pelar hacia atrás. ¡Eso es genial!" Es realmente molesto tener que lidiar con respuestas no reales de personas que ni siquiera han leído las preguntas cuidadosamente. Lo siento pero tuve que decirlo. – cprcrack

0

reemplazar el método viewWillDisappear de su underMapViewController con algo como esto:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f); 

    [super viewWillDisappear:animated]; 
} 

que corrige el tamaño de la vista de la curlableMapViewController al tamaño saber que especifique, que podría ahorrar más temprano en el método viewWillAppear, por ejemplo.

Cuestiones relacionadas