私は自分のアプリケーションで UIPageViewController を使用しており、その中にいくつかの UIButtons をメニューのように入れたいと思っていました。私が抱えている問題は、UIButton アクションが適用されるのではなく、UIButton (または他のインタラクティブな要素) を画面の端の近くに配置してタップすると、ページが変更されることです (端をタップするため)。画面の変更は、UIPageViewController のページを変更します)。ボタンをタップすると、ページを変更する代わりに適切なアクションが適用されるように、UIButton が UIPageViewController よりも優先されるようにする方法があるかどうかを知りたいです。
8 に答える
私は同じ問題でここに来ました。Splitのリンクに答えがあります。
ルート ビュー コントローラーを の各UIPageViewController
ジェスチャ レコグナイザーのデリゲートにし、いずれかの内部で発生した場合にタッチが配信されないようにしますUIControl
。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return ([touch.view isKindOfClass:[UIControl class]] == NO);
}
UIPageViewController には 2 つの UIGestureRecognizer があります。これらには、gestureRecognizers プロパティを介してアクセスできます。どれが UITapGestureRecognizer であるかを判断し、これを使用します。お役に立てれば。
コードをコピーして貼り付けたいだけの人のために、ここに私のものがあります:
// 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の作成後にこの関数を呼び出すだけです。
コードからこれらの行をコメントアウトします
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
または、Split の指示に従って UIGestureRecognizer を使用します
これがあなたを助けることを願っています
これと同じ問題があり、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 }
ここでは、UIPageViewController のタップ ジェスチャ レコグナイザーをインターセプトするソリューションはどれもうまくいきませんでした。iOS 8および9をターゲットにしています。
機能したのは、のサブクラスであるカスタム ボタンの関数touchesBegan
、、、およびtouchesCancelled
をオーバーライドすることです。次に、カスタム ボタンのフレーム内でタッチが開始および終了した場合に、コントロール イベントを手動で送信します。touchesMoved
touchesEnded
UIControl
.TouchUpInside
含まれているページ ビュー コントローラー、またはページ ビュー コントローラーを含むビュー コントローラーに対して、特別なことをする必要はありませんでした。