UIImage qui suit touche

J'essaie de dessiner un ruller qui suit les touches sur l'écran. Au premier toucher, je règle le premier point et sur tous les autres, le ruller suit le doigt sur le redimensionnement de l'écran et tourne autour du premier point en fonction de l'endroit où se trouve le doigt.

J'ai essayé de faire ceci:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint p = [touch locationInView:self.view]; self.regleFirstPoint = p; UIImageView* img = [[UIImageView alloc] initWithImage:self.regleImg]; img.frame = CGRectMake(self.regleFirstPoint.x, self.regleFirstPoint.y, 0, self.regleImg.size.height); [self.view addSubview:img]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint p = [touch locationInView:self.view]; // Width float deltaY = py - self.regleFirstPoint.y; float deltaX = px - self.regleFirstPoint.x; float width = sqrt((deltaX * deltaX) + (deltaY * deltaY)); // Angle float angleInRadians = atanf(deltaY / deltaX); float angleInDegrees = angleInRadians * 180 / M_PI; // JUST FOR INFO NSLog(@"angle : %f / %f", angleInRadians, angleInDegrees); // Resizing image UIImageView* img = [self.regles lastObject]; img.frame = CGRectMake(self.regleFirstPoint.x, self.regleFirstPoint.y, width, self.regleImg.size.height/2); img.center = self.regleFirstPoint; CGAffineTransform transform = CGAffineTransformIdentity; img.transform = CGAffineTransformRotate(transform, angleInRadians); } 

Le ruller ne suit pas le doigt correctement, je pense que j'ai raté quelque chose. Qu'est ce qui ne va pas avec mon code ?

EDIT : J'ai aussi essayé cela après quelques searchs:

 // Resizing images img.frame = CGRectMake(self.regleFirstPoint.x, self.regleFirstPoint.y, largeur, self.regleImg.size.height/2); [img.layer setAnchorPoint:CGPointMake(self.regleFirstPoint.x / img.bounds.size.width, self.regleFirstPoint.y / img.bounds.size.height)]; img.transform = CGAffineTransformRotate(img.transform, angleInRadians); 

C'est juste une question d'ordre:

  1. Définir la transformation de votre vue en identité
  2. Changer le cadre de votre vue
  3. Enfin, appliquez votre transformation

Voici un morceau de code mis à jour, juste utilisé un UIView à la place de votre image:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; // Hold first touch self.regleFirstPoint = [touch locationInView:self.view]; // Reset view / image _rulerView.transform = CGAffineTransformIdentity; _rulerView.frame = CGRectMake(self.regleFirstPoint.x, self.regleFirstPoint.y, 0, CGRectGetHeight(_rulerView.frame)); } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint p = [touch locationInView:self.view]; // Compute width float deltaX = px - self.regleFirstPoint.x; float deltaY = py - self.regleFirstPoint.y; float width = sqrt((deltaX * deltaX) + (deltaY * deltaY)); // Compute angle float angleInRadians = atan2(deltaY, deltaX); NSLog(@"angle (rad) : %f", angleInRadians); NSLog(@"angle (deg) : %f", angleInRadians * 180 / M_PI); // First reset the transformation to identity _rulerView.transform = CGAffineTransformIdentity; // Set anchor point _rulerView.layer.anchorPoint = CGPointMake(0.0f, 0.5f); // Resizing view / image _rulerView.frame = CGRectMake(self.regleFirstPoint.x, self.regleFirstPoint.y, width, CGRectGetHeight(_rulerView.frame)); // Reset the layer position to the first point _rulerView.layer.position = self.regleFirstPoint; // Apply rotation transformation _rulerView.transform = CGAffineTransformMakeRotation(angleInRadians); } 

J'espère que cela pourra aider.

Cyril