NSObject
プロトコルを実装するUIViewControllerInteractiveTransitioning
サブクラスを作成して、2つのUIViewController
s間のカスタムのインタラクティブな遷移を管理する方法の簡潔な例に興味があります。理想的には、スワイプジェスチャーへの応答です。 UINavigationController
に付属するiOS7のデフォルトのインタラクティブなスワイプに似たものですが、これのカスタム/手動の実装例です。
私はドキュメントを読みました:
そして、他のいくつかの例を見てください:
UIViewController
containment
ではなく、これらの遷移の手動実装とUIViewControllerInteractiveTransitioning
についての詳細です。ドキュメントはかなり明確ですが、サンプルコードを参照しないでください。また、例は少し残されています(さまざまな部分がどのように結び付けられているかについての未回答の質問)。
だから私の質問は:
UIViewControllerInteractiveTransitioning
プロトコルを実装するオブジェクトに結び付ける方法について空白を埋めることができますか?前もって感謝します...
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
サブクラスを使用せずに)その後、完全な移行を管理する責任があります(それについてはわかりません。申し訳ありませんが、私の意見ではドキュメントは本当に明確ではありません) 。
Appleは確かに サンプルプロジェクト を提供しています。そうは言っても、これが最高の/明確な例だとは思いませんが、正しい道を歩むはずです。
また、 WWDCビデオ を使用して、このプロジェクトを説明しています。
これはかなり複雑な例であることに注意してください。しかし、どうにかしてそれをバラバラにしてさまざまな部分を理解することができた場合、移行の最前線で多かれ少なかれ対処する準備ができているはずです。
基本的に、プロジェクトは問題を2つのヘルパークラスに分割します。1)View Controllerで初期化され、存続期間中存在するAssetTransitionController
と、2)であるAssetTransitionDriver
オブジェクトトランジションの最初に作成され、トランジションの期間中に存在します。
AssetTransitionController
は非常に単純で、UIViewControllerAnimatedTransitioning
およびUIViewControllerInteractiveTransitioning
のライフサイクルを管理するAssetTransitionDriver
に準拠しています。
AssetTransitionDriver
は単純なNSObject
サブクラスですが、実際にははるかに複雑になります。メインUIViewPropertyAnimator
を管理し、遷移のビュー階層を作成し、インタラクションドライバー(パンジェスチャ認識ツール)に応答します。また、要求されると、アニメーターをAssetTransitionController
に渡します。
UIPercentDrivenInteractiveTransition
は一切使用しません。