0

を使用して、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 ビューに渡される他のジェスチャも停止します (ボタンのタップなど)。UIPageViewControllerhitTest:withEvent:

遷移nilスタイルがUIPageViewControllerTransitionStyleScroll.

私は現在 iOS6/iOS7 でテストしています。

4

1 に答える 1

0

オブジェクトまたはその を実装するオブジェクトでcurrentPageIndex追跡するプロパティに反応することで、目的の効果を達成できる場合があります。このプロパティを確認し、デリゲート メソッドの 1 つ (おそらく以下の 2 つのうち後者) の内部で却下を処理します。UIPageViewControllerdatasourcecurrentPageIndex == 0 || n-1UIPageViewController

#pragma mark - UIPageViewController Delegate

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
    NSLog(@"will transition");
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    NSLog(@"did finish animating");
}

うまくいけば、これは役に立ちます...

于 2013-10-03T18:44:59.927 に答える