iPhone – Déplacer un object le long d'un trajet tactile et glisser

Je développe une animation simple où un UIImageView se déplace le long d'un UIBezierPath , maintenant je veux fournir l'interation de l'user au UIImageView mobile afin que l'user puisse guider le UIImageView en touchant le UIImageView et faites glisser le UIImageview autour de l'écran.

Vous voulez donc que l'user puisse toucher une image au milieu d'une animation d'image key le long d'un path courbe et le faire glisser vers un location différent? Que voulez-vous arriver à l'animation à ce moment-là?

Vous avez plusieurs défis.

Le premier est la détection du toucher sur l'object pendant qu'une animation par image key est "en vol".

Pour ce faire, vous souhaitez utiliser la méthode hitTest de la couche de présentation de la vue parente.

La couche de présentation d'une couche représente l'état de la couche à un instant donné, y compris les animations.

Une fois que vous avez détecté des touchers sur votre vue, vous devez get l'location actuel de l'image à partir de la couche de présentation, arrêter l'animation et prendre le relais avec une animation basée sur touchesMoved / touchesDragged.

J'ai écrit une application de démonstration qui montre comment détecter les contacts sur un object qui est animé le long d'un path. Ce serait un bon sharepoint départ.

Jetez un oeil ici:

Démo Core Animation incluant la détection de touches sur une vue pendant qu'une animation est "en vol".

Modifier le cadre de la position de l'affichage de l'image dans touchesMoved: withEvent:.

Edit: du code

 - (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; } 

Vous devez également implémenter touchesEnded:withEvent: et touchesCanceled:withEvent:

Le moyen le plus simple serait de sous- UIImageView .

Pour un simple glisser, regardez le code ici (code emprunté à l'user MHC):

UIView glisser (image et text)

Puisque vous voulez faire glisser le long du path de Bézier, vous devrez modifier les 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]; } 

Ce que vous voulez exactement faire dans -(CGPoint) calculatePositionForPoint:(CGPoint)location est à vous. Vous pouvez par exemple calculer le point dans le path de Bézier qui est le plus proche de l' location . Pour un test simple, vous pouvez faire:

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

En cours de route, vous devrez décider ce qui se passe si l'user s'éloigne de votre path de Bézier précalculé.