iOS: вращение одним пальцем и перевод изображения - PullRequest
0 голосов
/ 10 ноября 2011

В настоящее время я слежу за этим Ссылка для выполнения поворота изображения одним пальцем и его исправной работы. Но мне интересно после выполнения поворота, как выполнить операцию перевода, если я хочу переместить изображение из одного положение экрана в любой другой позиции.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   // We can look at any touch object since we know we 
   // have only 1. If there were more than 1 then 
   // touchesBegan:withEvent: would have failed the recognizer.
   UITouch *touch = [touches anyObject];

   // A tap can have slight movement, but we're not interested
   // in a tap. We want more movement. So if a tap is detected
   // fail the recognizer. 
   if ([self state] == UIGestureRecognizerStatePossible) {
      [self setState:UIGestureRecognizerStateBegan];
   } else {
      [self setState:UIGestureRecognizerStateChanged];
   }

   // To rotate with one finger, we simulate a second finger.
   // The second figure is on the opposite side of the virtual
   // circle that represents the rotation gesture.

   UIView *view = [self view];
   CGPoint center = CGPointMake(CGRectGetMidX([view bounds]), CGRectGetMidY([view bounds]));
   CGPoint currentTouchPoint = [touch locationInView:view];
   CGPoint previousTouchPoint = [touch previousLocationInView:view];

   // use the movement of the touch to decide
   // how much to rotate the carousel
   CGPoint line2Start = currentTouchPoint;
   CGPoint line1Start = previousTouchPoint;
   CGPoint line2End = CGPointMake(center.x + (center.x - line2Start.x), center.y + (center.y - line2Start.y));
   CGPoint line1End = CGPointMake(center.x + (center.x - line1Start.x), center.y + (center.y - line1Start.y));

   //////
   // Calculate the angle in radians.
   // (From: http://iphonedevelopment.blogspot.com/2009/12/better-two-finger-rotate-gesture.html )
   CGFloat a = line1End.x - line1Start.x;
    CGFloat b = line1End.y - line1Start.y;
    CGFloat c = line2End.x - line2Start.x;
    CGFloat d = line2End.y - line2Start.y;

   CGFloat line1Slope = (line1End.y - line1Start.y) / (line1End.x - line1Start.x);
   CGFloat line2Slope = (line2End.y - line2Start.y) / (line2End.x - line2Start.x);

    CGFloat degs = acosf(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d))));

   CGFloat angleInRadians = (line2Slope > line1Slope) ? degs : -degs;
   //////

   [self setRotation:angleInRadians];
}

1 Ответ

1 голос
/ 10 ноября 2011

Я не уверен, что мой ответ поможет вам, но я боюсь, что вы не можете одновременно выполнять вращение в одно касание и перевод в одно касание.Действительно, ваш код всегда интерпретирует одно касание как вращение, «имитируя» присутствие второго прикосновения пальца к дисплею.

То, что вы можете сделать, - это попытаться различить два жеста одним пальцем, чтобы связать однос вращением, а другой с переводом.Например, жест для перевода может быть «длинным прикосновением» (т. Е. Вы касаетесь и продолжаете касаться в течение некоторого времени, затем перемещаете объект).

Надеюсь, это поможет, в любом случае ...

...