web-dev-qa-db-ja.com

UIViewControllerInteractiveTransitioning Delegate Protocolを使用して、カスタムUIViewControllerインタラクティブトランジションを実装する適切な方法

NSObjectプロトコルを実装するUIViewControllerInteractiveTransitioningサブクラスを作成して、2つのUIViewControllers間のカスタムのインタラクティブな遷移を管理する方法の簡潔な例に興味があります。理想的には、スワイプジェスチャーへの応答です。 UINavigationControllerに付属するiOS7のデフォルトのインタラクティブなスワイプに似たものですが、これのカスタム/手動の実装例です。

私はドキュメントを読みました:

そして、他のいくつかの例を見てください:

  • 1
  • 2
  • スリー
  • four (これを設定しましたが、UIViewControllercontainmentではなく、これらの遷移の手動実装とUIViewControllerInteractiveTransitioningについての詳細です。

ドキュメントはかなり明確ですが、サンプルコードを参照しないでください。また、例は少し残されています(さまざまな部分がどのように結び付けられているかについての未回答の質問)。

だから私の質問は:

  1. 誰かがジェスチャ(スワイプなど)をUIViewControllerInteractiveTransitioningプロトコルを実装するオブジェクトに結び付ける方法について空白を埋めることができますか?
  2. UIViewControllerInteractiveTransitioningプロトコルを実装するオブジェクトとUIViewControllerAnimatedTransitioningプロトコルを実装するオブジェクトとの関係は何ですか?インタラクティブなトランジションをトリガーするには両方が必要なようです...

前もって感謝します...

44
Alfie Hanssen

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の関数UIViewControllerAnimatedTransitioningは、インタラクティブな遷移を実行するために使用されます。 updateInteractiveTransitionへの以前の呼び出しのおかげで、自動的に「キーフレーム」に分割されます。ただし、startInteractiveTransition:UIViewControllerInteractiveTransitioningのメソッド(したがってUIPercentDrivenInteractiveTransitionサブクラスを使用せずに)その後、完全な移行を管理する責任があります(それについてはわかりません。申し訳ありませんが、私の意見ではドキュメントは本当に明確ではありません) 。

12
MatterGoal

Appleは確かに サンプルプロジェクト を提供しています。そうは言っても、これが最高の/明確な例だとは思いませんが、正しい道を歩むはずです。

また、 WWDCビデオ を使用して、このプロジェクトを説明しています。

これはかなり複雑な例であることに注意してください。しかし、どうにかしてそれをバラバラにしてさまざまな部分を理解することができた場合、移行の最前線で多かれ少なかれ対処する準備ができているはずです。

基本的に、プロジェクトは問題を2つのヘルパークラスに分割します。1)View Controllerで初期化され、存続期間中存在するAssetTransitionControllerと、2)であるAssetTransitionDriverオブジェクトトランジションの最初に作成され、トランジションの期間中に存在します。

AssetTransitionControllerは非常に単純で、UIViewControllerAnimatedTransitioningおよびUIViewControllerInteractiveTransitioningのライフサイクルを管理するAssetTransitionDriverに準拠しています。

AssetTransitionDriverは単純なNSObjectサブクラスですが、実際にははるかに複雑になります。メインUIViewPropertyAnimatorを管理し、遷移のビュー階層を作成し、インタラクションドライバー(パンジェスチャ認識ツール)に応答します。また、要求されると、アニメーターをAssetTransitionControllerに渡します。

UIPercentDrivenInteractiveTransitionは一切使用しません。

6
Tricky