UIGestures переведены на скорость - PullRequest
2 голосов
/ 08 марта 2012

Итак, я смотрю на некоторый код, и в основном есть ряд изображений, и вы проводите пальцем по ряду, а изображения карт перемещаются в ряду в соответствии с проведением. Как будто вы щелкаете им, а затем он перемещает 5 карт вниз по списку. Вы слегка ударяете по нему, затем перемещаете одну карту вниз по списку. Он также имеет возможность ввести номер карты, как если бы вы начинали с карты 1 и хотели перейти на карту 52, вы набираете 52, и он прокручивает все 51 карту, чтобы добраться до карты 52, и останавливается. Как жест смахивания, так и код goToCard вызывают следующий метод:

   - (void)doAnimation {
      double elapsed = CACurrentMediaTime() - startTime;
      if (elapsed >= runDelta) [self endAnimation];
      else {
         [self updateAnimationAtTime:elapsed];
      }
   }

    - (void)updateAnimationAtTime:(double)elapsed
    {
        int max = 52;

        if (elapsed > runDelta) elapsed = runDelta;
        double delta = fabs(startSpeed) * elapsed - FRICTION * elapsed * elapsed / 2;
        if (startSpeed < 0) delta = -delta;
        offset = startOff + delta;
    }

Похоже, что разработчик пытался сопоставить физическое уравнение скорости с

DeltaX = Vot + (1/2) accel * time^2

Это работает довольно хорошо, когда я тестирую его, так как образы карточек вначале ускоряются в соответствии с вашим пролистыванием, а затем замедляются по мере приближения к runDelta (конечной точке).

Есть еще одна функция, которая вызывает updateAnimationAtTime, например:

- (void)goToCard:(int)pos {
   int max = 52;
   startSpeed = sqrt(fabs(pos - startOff) * FRICTION * 2);
   runDelta = fabs(startSpeed / FRICTION);
   startTime = CACurrentMediaTime();
   timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self        selector:@selector(doAnimation) userInfo:nil repeats:YES];
}

Похоже, что в приведенной выше функции startSpeed ​​вычисляется так же, как в физике:

Vf ^ 2 = Vo ^ 2 + 2ug (Xf - Xi) где u - коэффициент трения, и они предполагают, что сила тяжести равна 1.

Итак, код работает, но когда количество карточек увеличивается с 52 до 300, анимация выглядит забавно, поскольку она перебирает 300 карточек, чтобы пройти от начала до конца. Я никогда по-настоящему не реализовывал в коде физику, и мне было интересно, есть ли у кого-нибудь какие-либо предложения или советы, как изменить код, чтобы он по-прежнему давал пользователю эффект, что мы перебираем все карточки, но не перебираем все их, когда он превышает 50, потому что анимация начинает выглядеть забавно, так как она начинает вращаться так быстро, что первоначальный эффект циклического перемещения по картам теряется.

Пожалуйста, дайте мне знать, если что-то нужно уточнить в моем вопросе. Спасибо!

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