Подтвердить что ты не робот

IOS перетащить, щелкнуть или выбросить UIView

Интересно, как я собираюсь щелкнуть или перевернуть UIView, например http://www.cardflick.co/ или https://squareup.com/cardcase демонстрационные ролики.

Я знаю, как перетаскивать предметы, но как вы даете им гравитацию/инерцию. Это обрабатывается IOS?

4b9b3361

Ответ 1

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

Поддержка для облегчения и упрощения доступна в iOS, поэтому я не думаю, что вам нужна внешняя библиотека и не напряженная работа (хотя, как вы можете себе представить, вашему эффекту потребуется много тонкой настройки).

Это будет оживлять перевод объекта в заданную позицию с эффектом расслабления:

 [UIView animateWithDuration:2.0 delay:0
         options:UIViewAnimationOptionCurveEaseOut
         animations:^ {
               self.image.center = finalPosition;
         }
         completion:NULL];
 }

Если вы обрабатываете свой жест с помощью UIPanGestureRecognizer, распознаватель жестов предоставит вам две важные данные для вычисления конечной позиции: velocity и translation, которые соответственно соответствуют тому, насколько быстро и насколько перемещен объект.

Вы можете установить распознаватель жестов в вашем представлении (это будет объект, который вы хотели бы оживить, я думаю) следующим образом:

    UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
    [yourView addGestureRecognizer:panGestureRecognizer];
            [panGestureRecognizer release];

И затем обработайте анимацию в вашем обработчике:

 - (void)handlePanFrom:(UIPanGestureRecognizer*)recognizer {

    CGPoint translation = [recognizer translationInView:recognizer.view];
    CGPoint velocity = [recognizer velocityInView:recognizer.view];

    if (recognizer.state == UIGestureRecognizerStateBegan) {    
    } else if (recognizer.state == UIGestureRecognizerStateChanged) {
        <track the movement>
    } else if (recognizer.state == UIGestureRecognizerStateEnded) {
        <animate to final position>
    }
 }

Ответ 2

iOS не имеет встроенного API для гравитации/инерции. Ваши лучшие варианты:

  • Имитировать эффект с анимацией: если вы перемещаете объект по направлению к цели (ему не нужно отскакивать от вещей), вы, вероятно, могли бы получить довольно хороший результат, просто отправив его цели и настройки кривая времени анимации.

  • Используйте библиотеку физики. Chipmunk является высококачественным, и доступно много поддержки iOS. Вы настраиваете объекты, назначаете их веса, описываете их фигуры, а затем код библиотеки даст вам обновленные (x, y) координаты, чтобы вы могли обновлять свои объекты на экране.

Ответ 3

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