iOS - продвинутая анимация с помощью Swipe W / Velocity Of Swipe - PullRequest
3 голосов
/ 01 февраля 2011

В основном я пытаюсь положить палец на глобус и раскрутить его функцией типа.

Так что все, что мне действительно нужно сделать, это определить направление движения и скорость с помощью короткого таймера (? 500 мс?)

Так что-то вроде

While(swiping) {
   Get(pointTouched);
   swipeDirection = Calc(direction);
   swipeSpeed = Calc(speed);

   FramesToPlay = swipeSpeed * ConstantAmount;

   If(Direction == Backwards){
      FramesToPlay = FramesToPlay * -1;
   }

   Play(playAnimation, FramesToPlay);

   wait(500ms);
}

Кто-нибудь знает что-нибудь подобное? Или какие-нибудь части, которые я могу собрать вместе?

Я понял, что анимация - это только детали этого смахивания, которые меня смущают.

Ответы [ 3 ]

9 голосов
/ 01 февраля 2011

Возможно, вы могли бы использовать UIPanGestureRecognizer, который имеет метод velocityInView:.Я не проверял это, но похоже, что оно должно работать:

- (void)handlePanGesture:(UIPanGestureRecognizer *)pan
{
    if (pan.state == UIGestureRecognizerStateEnded)
    {
        CGPoint vel = [pan velocityInView:self.view];
        [self doSpinAnimationWithVelocity:vel.x];
    }
}

Кроме того, когда pan.state == UIGestureRecognizerChanged, вы можете повернуть свой глобус вместе с пальцем.

2 голосов
/ 01 февраля 2011

Используйте делегаты touchesBegan и touchesMoved в текущем UIView. Эти делегаты возвращают координаты xy и метки времени. Вы можете оценить скорость касания или удара, разделив пифагорейское расстояние между касаниями на время дельты, и получить угол от atan2 (dy, dx). Вы также можете усреднить или отфильтровать возвращаемую скорость, выполнив это для нескольких событий касания.

1 голос
/ 01 февраля 2011

Вот как я бы это сделал: создайте подкласс UISwipeGestureRecognizer. Целью этого подкласса будет просто запомнить самые первые и последние UITouch объекты, которые он получает в своем методе touchesBegan:withEvent:. Все остальное будет перенаправлено на super.

Когда ваш распознаватель запускает свое действие, распознаватель будет передан как параметр sender. Вы можете запросить его для объектов начального и конечного касания, затем используйте метод locationInView: и свойство timestamp, чтобы определить скорость удара (скорость = изменение расстояния / изменение во времени).

Так что это будет примерно так:

@interface DDSwipeGestureRecognizer : UISwipeGestureRecognizer 

@property (nonatomic, retain) UITouch * firstTouch;
@property (nonatomic, retain) UITouch * lastTouch;

@end

@implementation DDSwipeGestureRecognizer
@synthesize firstTouch, lastTouch;

- (void) dealloc {
  [firstTouch release];
  [lastTouch release];
  [super dealloc];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  [self setFirstTouch:[touches anyObject]];
  [super touchesBegan:touches withEvent:event];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  [self setLastTouch:[touches anyObject]];
  [super touchesEnded:touches withEvent:event];
}

@end

Тогда в другом месте вы бы сделали:

DDSwipeGestureRecognizer *swipe = [[DDSwipeGestureRecognizer alloc] init];
[swipe setTarget:self];
[swipe setAction:@selector(swiped:)];
[myView addGestureRecognizer:swipe];
[swipe release];

А ваши действия будут выглядеть примерно так:

- (void) swiped:(DDSwipeGestureRecognizer *)recognizer {
  CGPoint firstPoint = [[recognizer firstTouch] locationInView:myView];
  CGPoint lastPoint = [[recognizer lastTouch] locationInView:myView];
  CGFloat distance = ...; // the distance between firstPoint and lastPoint
  NSTimeInterval elapsedTime = [[recognizer lastTouch] timestamp] - [[recognizer firstTouch] timestamp];
  CGFloat velocity = distance / elapsedTime;

  NSLog(@"the velocity of the swipe was %f points per second", velocity);
}

Предупреждение: код набран в браузере и не скомпилирован. Будьте бдительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...