のナビゲーション動作をカスタマイズしたいUIPageViewController
; 具体的には、ユーザーが画面上のどこに指をドラッグしたかに基づいて、さまざまなページに移動したいと考えています。どこから始めるべきかについての指針はありますか?
1 に答える
UIPanGestureRecognizer
ページビューコントローラのカールナビゲーションは、とによってトリガーされUITapGestureRecognizer
ます。これらは、ページビューコントローラのgestureRecognizers
プロパティにあります。
pageViewController:viewControllerBeforeViewController:
メソッドとメソッドでは、pageViewController:viewControllerAfterViewController:
パンジェスチャレコグナイザーにページビューコントローラーのビューでの位置を要求し、それを使用してナビゲートする場所を決定できます。実際に決定を現在表示されているViewControllerに委任することをお勧めします。
static UIPanGestureRecognizer *panRecognizerOfPageViewController(UIPageViewController *pageViewController) {
for (id recognizer in pageViewController.gestureRecognizers) {
if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]])
return recognizer;
}
return nil;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)vc
{
DetailViewController *dvc = (DetailViewController *)vc;
UIPanGestureRecognizer *panner = panRecognizerOfPageViewController(pageViewController);
CGPoint point = [panner locationInView:dvc.view];
return [dvc priorViewControllerWithPoint:point];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)vc
{
DetailViewController *dvc = (DetailViewController *)vc;
UIPanGestureRecognizer *panner = panRecognizerOfPageViewController(pageViewController);
CGPoint point = [panner locationInView:dvc.view];
return [dvc nextViewControllerWithPoint:point];
}
私のテストでは、パンジェスチャレコグナイザーにその場所を尋ねるだけです。ジェスチャがパンの場合、両方の認識機能は「可能」の状態になります。ジェスチャがタップの場合、パンレコグナイザーは「失敗」の状態ですが、とにかくタップタッチの位置を報告します。
もちろん、これは文書化された動作ではありません。それに依存したくない場合は、別の方法で現在のタッチの場所にアクセスする必要があります。おそらく、のサブクラスを使用してUIWindow
そのサブクラスをオーバーライドし、sendEvent:
最新のタッチイベントをインスタンス変数に保存して簡単にアクセスできるようにします。