単純なストーリーボードIPadプロジェクトにUIViewControllerがあり、UIScrollViewが表面全体(1024 x 768)に配置されています。アプリケーションがviewDidLoadで起動時にロードするUIViewである3つのXIBファイルを作成し、それらをUIScrollViewに追加しました。これら3つのXIBファイルには、それぞれ1つのUIButtonのみが含まれています。
これは階層です:
〜UIViewController(IViewControllerClassはこのUIViewControllerのクラスです)
~~ UIScrollView(3つの同一のUIViewを含む)
~~~ UIView(IViewClassはこのXIBファイルのファイルの所有者です)
~~~~ UIButton
UIViewControllerClassが両方を認識できるようにしたいと思います。UIScrollViewコンポーネントの任意の場所をタッチし、UIScrollViewがタッチされた場合、UIScrollViewのUIView内のUIButtonがタッチされた場合、そのボタンが正確にタッチされたという情報を取得します。
UIScrollViewのUIView内のUIButtonにタッチするためにUIViewClass内のIBActionを作成し、すべての要素(UIViewController、UIView、およびUIScrollView)でUser Interaction Enabled = YESを設定すると、このメソッドが正常に呼び出されます。
しかし、この時点で、私のUIViewControllerClassは、そのUIButtonのUIScrollView内でタッチが発生したことを認識していません。私はこのようなタッチレコグナイザーを作成しました:
UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)];
touch.numberOfTouchesRequired = 1;
それをUIScrollViewコンポーネントに追加しました。このようにして、UIViewControllerClassのUIScrollViewコンポーネントでタッチイベントを検出できますが、UIScrollView内にあるUIViewのUIButtonのタッチイベントハンドラーは呼び出されなくなりました。
したがって、UIViewControllerClassに次の2つの情報が必要です。
UIScrollViewコンポーネント全体にタッチイベントレコグナイザーをアタッチすることは、UIViewClass内に記述したすべてのタッチイベントハンドラーを無効にするため、解決策ではないと思います。
解決策は、UIScrollView内のUIViewのコンポーネントに対して行われたタッチを、UIViewControllerClassに送信する必要があることだと思いますが、これを行う方法が見つかりませんでした。
誰かが私を助けてくれるなら、私はとても感謝しています。前もって感謝します。
[編集#1:鄭による回答]
タップジェスチャでは、cancelsTouchesInViewオプションを[〜#〜] no [〜#〜]に設定する必要があります。
上記の私の場合、この行はすべてを解決します。
touch.cancelsTouchesInView = NO;
鄭に感謝します。
これがうまくいくかどうかはわかりませんが、scrollview内のビューのタッチイベントに関する回答をここに示します。
アイデアは、スクロールビュー領域内のすべてのタップジェスチャを飲み込まないようにscrollViewに指示することです。
とにかくここにコードを貼り付けます。うまくいけば、問題が解決します。
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;
[pageScrollView addGestureRecognizer:tapGesture];
[tapGesture release];
...
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[myTextFieldInScrollView resignFirstResponder];
}
UIScrollViewをサブクラス化し、システムによって呼び出されるメソッド- hitTest:withEvent:
をオーバーライドして、イベントを処理するビューを決定できます。呼び出されるたびに、スクロールビュー内でタッチイベントが発生したと見なすことができ、スーパー実装を呼び出すことで、通常はイベントを処理するビューを取得できます。
uIscrollViewであらゆる種類のジェスチャをキャプチャできます。 cancelsTouchesInViewプロパティをfalseに設定するなど、いくつかのデフォルトプロパティも処理するようにしてください。これは、デフォルトではtrueです。また、セレクターで区別するために、サブビューにいくつかのタグ番号を付けます。 &また、ユーザーインタラクションをtrueに有効にします。
タップ= UITapGestureRecognizer(ターゲット:自己、アクション:
セレクター(didTapByUser(_ :)))