4

UIPageViewController「本」のページをめくる処理を行う があります。ただし、各本のページには がとしてViewController付いています。はのため、垂直方向にのみスクロールできます。問題は、ユーザーが を垂直にスクロールしている間、まだスクロール/減速しているため、ユーザーがページをめくることができないことです。これを確認する非常に簡単な方法は、ページをスクロールしてからビューの端をタップしてみることです。これは通常ページを変更しますが、が動いていないときはページを変更します。ただし、移動中にタップすると、ページをめくる代わりにスクロールビューの移動が停止します。 UIScrollViewsubviewUIScrollViewcontentSizescrollviewscrollviewscrollview

がジェスチャを使用してページをタップまたはパンしてページめくりアニメーションを発生させようとしているscrollviews場合、ジェスチャをキャンセルするにはどうすればよいですか?UIPageViewController

達成したい動作の例については、iPhone 上の Twitter の公式クライアントを確認してください。フィードがまだスクロールから減速している間に、タイムラインからディスカバーにスワイプすることができます。

4

3 に答える 3

1

UIScrollViewスクロール イベントは他のアニメーションをブロックするためUIView、Twitter の場合、ビューをスワイプする前にスクロールを一瞬キャンセルしている可能性があります。あなたの質問で尋ねたように:

「UIPageViewController が、ページをタップまたはパンしてページめくりのアニメーションを発生させることで、ページをめくるジェスチャを使用しようとしている場合、スクロールビューのジェスチャをキャンセルするにはどうすればよいですか?」

回避策を提案します。

UIPageViewControllerの固有のに依存する代わりにUIPanGestureRecognizer、独自UIPanGestureRecognizerのものをページ ビューに含めて、ページの適切なセクションでパンが検出され、適切な方向に実行されたときに、その newがのをUIPanGestureRecognizerオーバーライドし、必要なアクションをトリガーするようにします。具体的には、次のことを行う必要があります。UIPageViewControllerUIGestureRecognizer

(1) を使用してスクロール アニメーションを停止します。

CGPoint offset = scrollView.contentOffset;
[scrollView setContentOffset:offset animated:NO];

(2)を使用してプログラムでページをめくる

- (void)setViewControllers:(NSArray *)viewControllers direction:
  (UIPageViewControllerNavigationDirection)direction animated:
  (BOOL)animated completion:(void (^)(BOOL finished))completion;

これにより、スクロール アニメーションが停止し、ページめくりが 1 回のスムーズなパン ジェスチャで完了します。

于 2014-11-11T02:29:53.903 に答える
0

UIGestureRecognizerクラスは、 requireGestureRecognizerToFail:メソッドを使用して、他のジェスチャ レコグナイザーへの依存関係を設定する可能性があります。
あなたの場合、このメソッドは次のように使用できます。

for (UIGestureRecognizer *gestureRecognizer in pageController.gestureRecognizers) {
    for (ViewController *viewController in viewControllers) {
        for (UIGestureRecognizer *gestureRecognizerForFail in viewController.scrollView.gestureRecognizers) {
            [gestureRecognizerForFail requireGestureRecognizerToFail:gestureRecognizer];
        }
    }
}
于 2014-04-24T18:01:43.007 に答える
-1

私は同じ問題を抱えていましたが、回避策を講じました...私の場合、ズームが有効になっているpdfがあります。だから私は例えば:

[scrollView setMaximumZoomScale:6];
[scrollView setMinimumZoomScale:1];

コントローラーとそのscrollViewを初期化すると、その直後に向きやページを変更するたびに、ズームが「遠くにある」場合にのみ、ページの幅に合わせてズームを変更します

CGFloat desiredWidth = scrollView.frame.size.width/pdfRect.size.width;
if (desiredWidth>[self zoomScale]) {
    [scrollView setZoomScale:desiredWidth animated:YES];
}

役立つことを願っています

于 2014-03-08T21:07:30.117 に答える