5

¿Qué debo hacer para implementar arrastrando y soltando una UIView desde UIPopoverController en la parte posterior UIView?Arrastrar y soltar desde UIPopoverController a otra UIView

Esta es la funcionalidad que proporcionan las páginas en su elemento emergente de medios de inserción, donde puede arrastrar una forma desde el UIPopoverController y soltarla en el documento principal.

Estoy realmente confundido con la bandeja UIGestureRecognizers y donde se implementarán.

Gracias,

Umer

+0

dude estoy confundido .. ¿qué son UIPopoverController y UIGestureRecognizers? No es seguro que los componentes UIKit. ¿Te refieres a algunas vistas personalizadas ... o algún tipo de funcionalidad que desees ...? – lukya

+1

@lukya UIPopovercontroller y UIGestureRecognizers son todos parte de UIKit para Ipad (Uigesturerecognizer es también para iphone) – Daniel

+0

@Daniel ¿Alguna idea sobre cómo se estructurarán los objetos? – umerh

Respuesta

6

usted tiene que tratar con dos controladores de vista que está en el fondo denominado mainController que presentarse conforme a una llamada UIPopoverViewController popoverController. Su popoverController podría agregar un UIPanGestureRecognizer a las vistas, que el usuario puede arrastrar. El objetivo de acción del gestureRecognizer podría ser un método en el popoverController.

Una vez que el usuario inicia una operación de arrastre, se llama a su método de acción con el gestureRecognizer como argumento, si el estado del gestureRecognizer es UIGestureRecognizerStateBegan. Podrías salvar el marco actual de la vista para poder animarlo cuando falle la caída. Puede que sea necesario mover la vista a otra supervista (la ventana, por ejemplo), porque no estoy seguro de si UIPopoverViewController recorta su vista.

A medida que el usuario arrastra, su método de acción se llama una y otra vez con el gestureRecognizer en el estado UIGestureRecognizerStateChanged. Utilice el método translationInView: en UIPanGestureRecognizer para determinar cuánto arrastró el usuario y actualizar en consecuencia las vistas arrastradas center/frame/transform.

Una vez que el usuario levanta el dedo, el método de acción se llama por última vez con el estado gestureRecoginzers establecido en UIGestureRecognizerStateEnded. Ahora es el momento de averiguar si el arrastre fue exitoso. Por ejemplo, popoverController podría preguntar al controlador principal a través de la delegación si hay un objetivo de bajada bajo la posición actual de las vistas, si es así, el controlador principal puede tomar medidas, de lo contrario, popoverController animaría la vista arrastrada de donde venía y la agregaría como una subvista a su vista.

Espero que esto sea de alguna manera comprensible y útil.

+0

Muchas gracias por la respuesta detallada. Creo que lo entiendo ahora. En UIGestureRecognizerStateBegan añadiré una nueva UIView a la ventana y finalmente ajustaré todo en UIGestureRecognizerStateEnded y eliminar UIView de la ventana sería el camino a seguir para mí. Gracias de nuevo. – umerh

7

De acuerdo con la documentación sobre UIPopoverController, cuando se presenta el popover, se presenta en una "ventana" especial. Debido a esto, simplemente agregar una subvista al controlador de vista de contenido del controlador de vista popover no es suficiente para poder arrastrar una vista fuera de la vista del controlador de vista Popover.

La solución más fácil aquí es crear su propia ventana, agregue su vista que se puede arrastrar a la ventana cuando se produce el arrastre. Haga que la ventana sea visible durante todo el proceso de arrastrar/soltar, y luego suelte su ventana cuando se complete.

Como se mencionó anteriormente, los reconocedores de gestos (GR) son los más adecuados para la funcionalidad de arrastrar/soltar.Una vez que el estado de GR ha cambiado a "Comenzó", el GR controlará todos los toques hasta que se logre el estado "Terminado" o "Cancelado" lo que lo hace ideal para arrastrar vistas entre controladores de vista y ventanas :)

Ejemplo:

@interface MySplitViewController : UISplitViewController { 

    UIView *dragView; 
    UIWindow *dragWindow; 
} 

Implementación: NOTA no necesitamos llamar "makeKeyAndVisible" en nuestra ventana. Solo tenemos que establecer su propiedad "Oculto"

De Apple en lo que respecta al método makeKeyAndVisible: // conveniencia. la mayoría de las aplicaciones lo llaman para mostrar la ventana principal y también hacerla clave. de lo contrario utilizar la vista de la propiedad oculta

-(void)dragBegan{ 

    self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame]; 
    [self.dragWindow addSubview:self.dragView]; 
    [self.dragWindow setHidden:NO]; 
} 

Aquí manejamos el gesto o el estado del reconocedor de "terminación" "Cancelado". NOTA: Es importante eliminar la ventana cuando se complete el Arrastrar/Soltar o perderá la interactividad del usuario con las vistas a continuación.

-(void)dragEnded{ 

    [self.dragView removeFromSuperview]; 

    [self.dragWindow setHidden:YES]; 
    [self.dragWindow release]; 

    [self.view addSubview:self.dragView]; 
}