iPhone: mueve el object a lo largo del toque y arrastra la ruta

Estoy desarrollando una animation simple donde un UIImageView mueve a lo largo de un UIBezierPath , ahora quiero proporcionar interación del usuario al UIImageView movimiento para que el usuario pueda guiar el UIImageView tocando el UIImageView y arrastrando el UIImageview por la pantalla.

Entonces, ¿quieres que el usuario pueda tocar una image en el centro de una animation de fotogtwigs key a lo largo de una ruta curva y arrastrarla a una location diferente? ¿Qué quieres que le pase a la animation en ese momento?

Tienes múltiples desafíos

Primero está detectando el toque en el object mientras que la animation de un fotogtwig key está "en vuelo".

Para hacerlo, quiere usar el método hitTest de la capa de presentación de la vista principal.

La capa de presentación de una capa representa el estado de la capa en cualquier momento dado, incluidas las animaciones.

Una vez que detecte toca su vista, tendrá que get la location actual de la image desde la capa de presentación, detener la animation y tomar el relevo con una animation basada en desmenuzados.

Escribí una aplicación de demostración que muestra cómo detectar toques en un object que se está animando a lo largo de una ruta. Eso sería un buen punto de partida.

Echa un vistazo aquí:

Core Demo de animation que incluye la detección de toques en una vista mientras que una animation está "en vuelo".

Cambia el marco de la position de la vista de la image en toques movidos: withEvent:.

Editar: algún código

 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { UITouch *touch = [[event allTouches] anyObject]; if ([touch.view isEqual: self.view] || touch.view == nil) { return; } lastLocation = [touch locationInView: self.view]; } - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { UITouch *touch = [[event allTouches] anyObject]; if ([touch.view isEqual: self.view]) { return; } CGPoint location = [touch locationInView: self.view]; CGFloat xDisplacement = location.x - lastLocation.x; CGFloat yDisplacement = location.y - lastLocation.y; CGRect frame = touch.view.frame; frame.origin.x += xDisplacement; frame.origin.y += yDisplacement; touch.view.frame = frame; lastLocation=location; } 

También debe implementar touchesEnded:withEvent: y touchesCanceled:withEvent:

La forma más fácil sería subclasificar UIImageView .

Para arrastrar simple, eche un vistazo al código aquí (código tomado del usuario MHC):

Vista rápida arrastre (image y text)

Dado que desea arrastrar por la ruta Bezier, deberá modificar los touchesMoved:

  -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *aTouch = [touches anyObject]; //here you have location of user's finger CGPoint location = [aTouch locationInView:self.superview]; [UIView beginAnimations:@"Dragging A DraggableView" context:nil]; //commented code would simply move the view to that point //self.frame = CGRectMake(location.x-offset.x,location.y-offset.y,self.frame.size.width, self.frame.size.height); //you need some kind of a function CGPoint calculatedPosition = [self calculatePositonForPoint: location]; self.frame = CGRectMake(calculatedPosition.x,calculatedPosition.y,self.frame.size.width, self.frame.size.height); [UIView commitAnimations]; } 

Qué exactamente le gustaría hacer en la -(CGPoint) calculatePositionForPoint:(CGPoint)location depende de usted. Podría, por ejemplo, calcular el punto en la ruta de Bezier que es la más cercana a la location . Para realizar una testing simple, puede hacer lo siguiente:

 -(CGPoint) calculatePositionForPoint:(CGPoint)location { return location; } 

En el path, tendrás que decidir qué sucede si el usuario se pregunta si está lejos de su path Bezier precalculado.