0

В моем случае у меня есть представление с контентом. Я хочу, чтобы просмотреть этот контент на UILongPressGestureRecognizer событий:Непрерывная анимация в iOS?

  • если позиция касания у достаточно близко вверх вид границы затем прокручивать вверх;
  • , если положение касания y достаточно близко к нижней границе изображения, затем прокрутите вниз.

Я не могу просто использовать scrollView, поэтому использовал CATransform3D structs и animateWithDuration:... методов. Проблема в том, что я не знаю, сколько времени нужно прокручивать (продолжительность анимации прокрутки). Вторая проблема заключается в том, что анимация должна быть вызвана, когда позиция касания (длинного жестов нажатия) изменяется - кажется, легко, но может повлиять на окончательное решение.

Как решить такую ​​проблему?

+0

* Почему * Вы не можете использовать прокрутку? – Caleb

+0

Хорошо, потому что я использую iCarousel. Но это не имеет никакого отношения к вопросу. –

+0

Разве не пункт 'iCarousel', как свиток, чтобы повернуть содержимое для вас? Я просто пытаюсь понять, почему вы делаете анимацию самостоятельно, а не используете контейнер, который в этом случае является карусели. – Caleb

ответ

0

Я не уверен, правильно ли я понял ваш вопрос, здесь я разделяю метод, который слушает longPressRecognizer и анимирует представление, пока пользователь нажимает на этот вид. По мере того, как пользователь перестает нажимать, просмотрите анимацию обратно до состояния по умолчанию. Вы можете проверить, удовлетворяет ли пользовательский жест вашим условиям позиции, добавив инструкции проверки позиции в if/else if. Надеюсь, это поможет.

- (void)longPressed:(UILongPressGestureRecognizer *)recognizer { 
    UIView *longPressView = self.longPressView; 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     [UIView animateWithDuration:longPressDuration 
           delay:0.f 
          options:UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
          //do stuff 
         } 
         completion:^(BOOL finished) { 
          if (finished) { 
           //long press exceeded time limit: do stuff 
          } 
         }]; 
    } 
    else if (recognizer.state == UIGestureRecognizerStateEnded) { 
     [UIView animateWithDuration:longPressDuration/2.0 
           delay:0.f 
          options:UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
          //do stuff 
         } 
         completion:nil]; 
    } 
} 
+0

1) Вы не поняли вопрос. Анимация должна начинаться также с события 'UIGestureRecognizerStateChanged'. С вашим кодом он работает так, как будто все приемлемо. Но у меня есть 2 области, и поэтому прикосновение может не только начаться/закончиться в этой области, но также может войти/выйти из этой области после 'UIGestureRecognizerStateBegan'. 2) почему вы используете 'if (finished)'? Я спрашиваю, потому что этот блок завершения будет вызываться при вращении устройства с 'finished == NO', и поэтому код в этом блоке никогда не будет выполнен. –

+0

что вам не нужно UILongPressGestureRecognizer. Посмотрите на UIPanGestureRecognizer. –

+0

Объясните мне, зачем мне «UIPanGestureRecognizer». В моем случае UILongPressGesture кажется более подходящим. –