IOS перетащить, щелкнуть или бросить UIView - PullRequest
12 голосов
/ 07 июля 2011

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

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

Ответы [ 3 ]

42 голосов
/ 07 июля 2011

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

Поддержка замедления и ослабления доступна в 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>
    }
 }
1 голос
/ 07 июля 2011

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

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

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

0 голосов
/ 07 июля 2011

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

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