46

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

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

そして、他の場所でいくつかの例を見ました:

  • 1
  • 2
  • 4 (私はこれを設定しましたがUIViewController containment、これらのトランジションを手動で実装することではなく、UIViewControllerInteractiveTransitioning

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

だから私の質問は:

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

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

4

2 に答える 2

13

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

于 2014-01-11T23:20:19.323 に答える