12

私は自分のアプリケーションで UIPageViewController を使用しており、その中にいくつかの UIButtons をメニューのように入れたいと思っていました。私が抱えている問題は、UIButton アクションが適用されるのではなく、UIButton (または他のインタラクティブな要素) を画面の端の近くに配置してタップすると、ページが変更されることです (端をタップするため)。画面の変更は、UIPageViewController のページを変更します)。ボタンをタップすると、ページを変更する代わりに適切なアクションが適用されるように、UIButton が UIPageViewController よりも優先されるようにする方法があるかどうかを知りたいです。

4

8 に答える 8

7

私は同じ問題でここに来ました。Splitのリンクに答えがあります。

ルート ビュー コントローラーを の各UIPageViewControllerジェスチャ レコグナイザーのデリゲートにし、いずれかの内部で発生した場合にタッチが配信されないようにしますUIControl

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ([touch.view isKindOfClass:[UIControl class]] == NO);
}
于 2012-02-15T20:14:33.533 に答える
4

UIPageViewController には 2 つの UIGestureRecognizer があります。これらには、gestureRecognizers プロパティを介してアクセスできます。どれが UITapGestureRecognizer であるかを判断し、これを使用します。お役に立てれば。

于 2011-11-07T20:28:12.190 に答える
2

コードをコピーして貼り付けたいだけの人のために、ここに私のものがあります:

// I don't want the tap on borders to change the page
-(void) desactivatePageChangerGesture {
     for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) {
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
            gestureRecognizer.enabled = NO;
        }
    }
}

UIPageViewControllerの作成後にこの関数を呼び出すだけです。

于 2012-09-13T11:50:33.367 に答える
1

コードからこれらの行をコメントアウトします

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

または、Split の指示に従って UIGestureRecognizer を使用します

これがあなたを助けることを願っています

于 2012-02-15T09:40:57.427 に答える
1

これと同じ問題があり、UIGestureRecognizer デリゲート メソッドを処理する方法がわかりませんでした。この短い例では、Xcode 4 で「ページ ベースのアプリケーション」プロジェクト タイプを使用していることを前提としています。

  • RootViewController.h、RootViewController が UIGestureRecognizerDelegate プロトコルを処理することを発表しました。

    @interface RootViewController : UIViewController <UIPageViewControllerDelegate, UIGestureRecognizerDelegate>
    
  • ではRootViewController.m、RootViewController を UITapGestureRecognizer のデリゲートとして割り当てました。これはviewDidLoadメソッドの最後で行われます。これを行うには、各gestureRecognizerを反復処理して、どれがUITapGestureRecognizerかを確認しました。

    NSEnumerator *gestureLoop = [self.view.gestureRecognizers objectEnumerator];
    id gestureRecognizer;
    while (gestureRecognizer = [gestureLoop nextObject]) {
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
            [(UITapGestureRecognizer *)gestureRecognizer setDelegate:self];
        }
    }
    
  • 最後に、gestureRecognizer:shouldReceiveTouch メソッドを下に追加しましたRootViewController.m(これは Split のリンクから直接コピーされます)。

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isKindOfClass:[UIControl class]]) {
            // we touched a button, slider, or other UIControl
            return NO; // ignore the touch
        }
        return YES; // handle the touch
    }
    
于 2012-04-11T20:47:14.080 に答える
0

ここでは、UIPageViewController のタップ ジェスチャ レコグナイザーをインターセプトするソリューションはどれもうまくいきませんでした。iOS 8および9をターゲットにしています。

機能したのは、のサブクラスであるカスタム ボタンの関数touchesBegan、、、およびtouchesCancelledをオーバーライドすることです。次に、カスタム ボタンのフレーム内でタッチが開始および終了した場合に、コントロール イベントを手動で送信します。touchesMovedtouchesEndedUIControl.TouchUpInside

含まれているページ ビュー コントローラー、またはページ ビュー コントローラーを含むビュー コントローラーに対して、特別なことをする必要はありませんでした。

于 2015-10-23T07:24:26.833 に答える