を使用して、UIPageViewController
いくつかのビュー コントローラーをスクロールしています。ただし、UIPageViewController
ビュー コントローラーの配列の最初と最後にある を閉じる必要があります。つまり、ページ ビュー コントローラーをスクロールしているときに、ビュー コントローラー配列の境界に達した場合は、ビュー コントローラーを閉じる必要があります。
却下のために、私はUIPanGestureRecognizer
呼び出されたを使用していdismissPanGestureRecognizer
ます。UIPageViewController のトランジション スタイルが の場合、これは素晴らしく機能しますUIPageViewControllerTransitionStylePageCurl
。その場合、ジェスチャーを次のように接続できます-
でviewDidLoad
:
[pageViewController.gestureRecognizers enumerateObjectsUsingBlock:^(UIGestureRecognizer *gR, NSUInteger idx, BOOL *stop){
gR.delegate = self;
[dismissPanGestureRecognizer requireGestureRecognizerToFail:gR];
}];
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
UIGestureRecognizerDelegate
メソッドについては、次のようなものです-
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
// If we are at the left boundary and this is a pan gesture going right-left,
// return NO
// Else If we are at the right boundary and this is a pan gesture going left-right,
// return NO
// Else return YES
}
ここまでは順調ですね。パン ジェスチャの場合、ページ ビュー コントローラーのジェスチャが関心がない場合にのみ、それを非表示にするために使用します。
この問題は、トランジション スタイルが の場合に発生しますUIPageViewControllerTransitionStyleScroll
。その場合、UIPageViewController
ジェスチャ認識機能はありません。内部ビュー (pageViewController.view.subviews) を使用して実装されているようUIQueuingScrollView
です。スクロール遷移タイプでは、View Controller の境界で、スクロール ビューがバウンスするだけで、パン ジェスチャ レコグナイザーが却下のために起動されることはありません。UIQueuingScrollViewのプロパティを NO に設定しようとしましbounces
たが、ページは変更されません。
次に、ビューUIView
の上に透明を追加してから実装してみました。境界にない場合にのみ、イベントを pageViewController に転送すると考えました。ただし、ページをめくるタイミングをある程度制御できますが、pageController ビューに渡される他のジェスチャも停止します (ボタンのタップなど)。UIPageViewController
hitTest:withEvent:
遷移nil
スタイルがUIPageViewControllerTransitionStyleScroll
.
私は現在 iOS6/iOS7 でテストしています。