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

Правильный способ реализации пользовательского интерактивного перехода UIViewController с использованием UIViewControllerInteractiveTransitioning Delegate Protocol

Мне интересен краткий пример создания подкласса NSObject, который реализует протокол UIViewControllerInteractiveTransitioning для управления пользовательским интерактивным переходом между двумя UIViewController s. В идеале в ответ на жестом салфетки. Что-то похоже на интерактивный салфетки по умолчанию iOS7, который теперь поставляется с UINavigationController, но пример использования/ручной реализации этого.

Я прочитал документы:

И рассмотрел несколько примеров в другом месте:

  • один
  • два
  • три
  • четыре (я установил это, но больше о UIViewController containment и ручной реализации этих переходов, а не UIViewControllerInteractiveTransitioning

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

Итак, мои вопросы:

  • Может ли кто-нибудь помочь заполнить пробелы о том, как связать жест (например, салфетки) с объектом, реализующим протокол UIViewControllerInteractiveTransitioning?
  • Какова связь между объектом, реализующим протокол UIViewControllerInteractiveTransitioning, и который реализует протокол UIViewControllerAnimatedTransitioning? Похоже, вы должны заставить оба инициировать интерактивные переходы...

Спасибо заранее...

4b9b3361

Ответ 1

1) Самый простой способ привязать жест к объекту UIViewControllerInteractiveTransitioning делает его подклассом UIPercentDrivenInteractiveTransition. Затем, где вы реализуете обработчик жестов, вы вызываете updateInteractiveTransition: здесь пример с кодом:

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch {

    CGFloat scale = pinch.scale;
    switch (pinch.state) {
      case UIGestureRecognizerStateBegan: {
          _startScale = scale;
          self.interactive = YES;
          [self.navigationController popViewControllerAnimated:YES];
          break;
      }
      case UIGestureRecognizerStateChanged: {
          CGFloat percent = (1.0 - scale/_startScale);
          [self updateInteractiveTransition:(percent < 0.0) ? 0.0 : percent];
          break;
      }
      case UIGestureRecognizerStateEnded: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
      case UIGestureRecognizerStateCancelled: {
          CGFloat percent = (1.0 - scale/_startScale);
          BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3);
          if (cancelled) [self cancelInteractiveTransition];
          else [self finishInteractiveTransition];
          break;
      }
    }
}

Этот код из https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

2) Функция animateTransition of UIViewControllerAnimatedTransitioning используется для выполнения интерактивного перехода. Он автоматически разделяется на "ключевые кадры" благодаря вашему предыдущему вызову updateInteractiveTransition. Но я полагаю, что если вы реализуете свой startInteractiveTransition: метод UIViewControllerInteractiveTransitioning (поэтому без использования подкласса UIPercentDrivenInteractiveTransition), вы отвечаете за управление полным переходом (не уверен в этом.. извините, но документация, на мой взгляд, не действительно ясно).