2011-02-12 10 views
8

Quiero tocar en una UIView y arrastrar para que esa vista siga mi dedo, lo suficientemente simple. Pero la forma más fácil de hacerlo es establecer el centro de los objetos donde ocurrió el tap (que no es lo que quiero), quiero que se mueva como si agarraras el objeto donde lo tocaste.Arrastrar UIView debajo del dedo

Hubo una forma muy útil de hacer esto y fue referencia en uno de los videos de iTunes U. El script no usó deltaX, deltaY para arrastrar la imagen debajo de donde la tocaste en lugar de tenerla centrada debajo de tu dedo, ¡pero no recuerdo qué código era ese!

¿Alguien tiene alguna referencia para este código? ¿O quizás tenga una forma eficiente de mover UIViews con un dedo sin tener el concepto uiview.center = tap.center?

+1

¿La respuesta ¿ayuda? Si es así, por favor verifíquelo como correcto o responda lo contrario ... – TigerCoding

+0

Respondió, no era lo que estaba buscando. – xil3

+0

¿Alguna vez encontró la solución? Sentiría curiosidad por ver uno que no usara un delta como decías haber visto. – sean

Respuesta

0

Creo que está hablando acerca de la aplicación acosador ...

// Tell the "stalker" rectangle to move to each touch-down 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [UIView beginAnimations:@"stalk" context:nil]; 
    [UIView setAnimationDuration:1]; 
    //[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    // touches is an NSSet. Take any single UITouch from the set 
    UITouch *touch = [touches anyObject]; 

    // Move the rectangle to the location of the touch 
    stalker.center = [touch locationInView:self]; 
    [UIView commitAnimations]; 
} 
+1

Gracias por el código, pero esto no es lo que estoy tratando de lograr. Quiero que el objeto se mueva debajo de mi dedo mientras lo arrastro para que el centro de la UIView se desplace de acuerdo con la forma en que muevo el dedo en lugar de centrarme en mi dedo – Parad0x13

+1

@ Parad0x13 Oye, ¿tienes alguna solución para tu problema? entonces avíseme por favor, ya que estoy enfrentando la misma situación y necesito resolverlo. –

0

Puede guardar tanto el punto en que tocó (T) y la posición actual de la vista (O). En touchMoved, puede moverlo según el nuevo punto agregando (O-T).

+0

Bien, podría hacer esto. Pero hay otra forma más limpia de hacerlo. Existe un marco de trabajo nativo de UIView que puede lograr lo que quiero sin tener que hacer los cálculos yo mismo. – Parad0x13

+1

Te pido disculpas. ¿Estás preguntando o haciendo una afirmación? :) Si encontró dicho marco, agregue un comentario aquí (o responda su propia pregunta), ¡para que el conocimiento sea público! ;) –

6

Aquí está el código del proyecto MoveMe de Apple. La clave es hacer esto en el método touchesMoved. Permite que el UIView (PlacardView) lo toque y se mueva a donde vaya el toque del usuario. Espero que esto ayude.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 

// If the touch was in the placardView, move the placardView to its location 
if ([touch view] == placardView) { 
    CGPoint location = [touch locationInView:self]; 
    placardView.center = location; 
    return; 
    } 
} 
+4

Problema con esto es si mueve su evento de dedo sin iniciar en la vista, cambiará su posición, y esto provoca un salto. –

+0

¡Ya está apuntando en la dirección correcta! Pero eso es lo que también pensé cuando lo leí :) –

9

El siguiente código es un ejemplo de un simple reconocedor de gestos que permitirá el movimiento del panel/vista. En lugar de modificar el centro, está modificando el punto de origen [básicamente estableciendo un nuevo marco para la vista de destino].

Puede optimizar esta en su situación por lo que no está teniendo que profundizar en la gesture.view ... etc

-(void)dragging:(UIPanGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateBegan) 
    { 
     //NSLog(@"Received a pan gesture"); 
     self.panCoord = [gesture locationInView:gesture.view]; 


    } 
    CGPoint newCoord = [gesture locationInView:gesture.view]; 
    float dX = newCoord.x-panCoord.x; 
    float dY = newCoord.y-panCoord.y; 

gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y+dY, gesture.view.frame.size.width, gesture.view.frame.size.height); 
} 

Swift 4:

@objc func handleTap(_ sender: UIPanGestureRecognizer) { 
     if(sender.state == .began) { 
      self.panCoord = sender.location(in: sender.view) 
     } 

     let newCoord: CGPoint = sender.location(in: sender.view) 

     let dX = newCoord.x - panCoord.x 
     let dY = newCoord.y - panCoord.y 

     sender.view?.frame = CGRect(x: (sender.view?.frame.origin.x)!+dX, y: (sender.view?.frame.origin.y)!+dY, width: (sender.view?.frame.size.width)!, height: (sender.view?.frame.size.height)!) 
    } 
+2

¿Qué es "panCoord" en tu código? –

+0

Mis disculpas, panCoord es el CGPoint local que realiza un seguimiento de dónde se está procesando actualmente. No me di cuenta de que la dependencia estaba allí y no estaba resuelta. Agregue un CGPoint panCoord para almacenar la ubicación actual de "dónde moverse desde" –

+0

¡Gracias señor! –

Cuestiones relacionadas