Cómo arrastrar suavemente el panel desde fuera de la pantalla, como la aplicación iPhone de JetBlue

Estoy buscando una manera de deslizar un panel de herramientas parcialmente oculto desde la pantalla, como lo hace la aplicación JetBlue para iPhone. Sé cómo hacerlo con los reconocedores de gestos normales, pero esa aplicación tiene un cierto umbral, después de lo cual el panel "se ajusta" a la position en pantalla, de lo contrario se esconde detrás de la pantalla.

¿Cómo puedo implementar este tipo de deslizamiento para mostrar, pero con un tipo de reconocimiento de gesto de umbral? ¿Hay algún proyecto de código abierto que haga este tipo de manipulación de UI?

Si ya puedes implementar los conceptos básicos con gestos, ¡ya casi estás ahí!

Para ser honesto, mientras que he hecho exactamente esto en mi aplicación, uso los toques pasados ​​de moda, el toque, el movimiento, etc.

En términos de gestos, tendrás que usar UIPanGestureRecognizer para que puedas tener control total del arrastre. UISwipeGestureRecognizer solo reconoce golpes.

De todos modos, después de un cierto punto, simplemente traduces el panel solo una fracción de la distancia que la persona arrastró.

 CGRect newPanelFrame = panel.frame; if (newPanelFrame.origin.y + dragOffset > 275) { newPanelFrame.origin.y += dragOffset / 2.0; } panel.frame = newPanelFrame; 

En touchesEnded:withEvent: o if (gestureRecognizer.state == UIGestureRecognizerStateEnded)

 CGRect newPanelFrame = panel.frame; if (newPanelFrame.origin.y > 275) { newPanelFrame.origin.y = 275; } panel.frame = newPanelFrame; 

La razón por la que nunca me he molestado con el UIPanGestureRecognizer es porque nunca podría encontrar la manera de get la traducción no acumulativa (translationForView: es acumulativa), lo que es necesario si desea networkingucir la velocidad de arrastre después del umbral.

Tengo un elemento de interfaz similar en una aplicación que he escrito. Mi elemento de interfaz es UIViewController para todo el panel de herramientas. Puse un button UIB sobre la ilustración de la pinza, cambie el tipo de button a personalizado para que desaparezca visualmente. Conecto Touch Drag Inside y Touch Drag Out a una IBAction que ajusta la position del panel de acuerdo a donde se mueve el arrastre. Conecto Touch Up Inside y Touch Up Outside a una IBAction que finaliza el posicionamiento de la vista. Si el evento de retoque ocurre demasiado cerca de la parte inferior, simplemente cierro el panel. Si ocurre en cualquier lugar más alto que ese umbral, abro el panel. Utilizo los methods de animation de UIView para suavizar estas transiciones. El elemento de extensión de más visto en la aplicación JetBlue se puede lograr en el manejador de events de arrastre. A medida que el panel se acerca más y más al límite, abra la vista una cantidad cada vez menor con cada movimiento del toque más alto. Luego, en la finalización, simplemente anima el panel hacia abajo en su position final preferida.

La aplicación JetBlue difiere de mi aplicación porque tengo un área pequeña de agarre, pero la aplicación de JetBlue te permite deslizar todo el panel para ajustar la position. Para hacer coincidir esa funcionalidad, ajustaría mi implementación para cubrir totalmente el panel con botones. Cada uno respondería a mis events de arrastre con la adición de que arrastraría un marcador. A continuación, mi manejador de events de retoque verificará si la bandera se configuró. Si es así, finalice el arrastre del panel. De lo contrario, realice la acción apropiada asociada con cada button.

Estaba haciendo una investigación para lograr un efecto similar, tropecé con esta publicación, y como resultado decidí probar JetBlue.

Después de jugar un rato con el panel deslizante, realmente estoy pensando que los chicos de JetBlue realmente hicieron esto de una manera un poco más diferente.

Los movimientos del control deslizante en la aplicación JetBlue parecen manejar mucho mejor que lo que puedes hacer con una colección de UIGestureRecognizers; es capaz de animar a diferentes velocidades dependiendo de la rapidez con que el usuario la desliza, y la banda de caucho también compensa esto correctamente.

Así que en esa nota, realmente creo que no están usando UIGestureRecognizers, pero ese panel es en realidad un UIScrollView estándar alineado a la parte inferior de la window de la aplicación, y con un poco de lógica adicional (probablemente aplicada a través del delegado) que simplemente se asegura de que no sea posible que la vista de desplazamiento deje de animar entre el estado 'abrir' y 'cerrar'.