web-dev-qa-db-ja.com

UIScrollViewおよびUIViewのコンポーネント[UIScrollView内に配置されている]でタッチイベントを検出します

単純なストーリーボード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コンポーネントのタッチが行われました
  • UIScrollView内にあるUIViewのUIButtonをタッチします(このボタンがタッチされた場合)

UIScrollViewコンポーネント全体にタッチイベントレコグナイザーをアタッチすることは、UIViewClass内に記述したすべてのタッチイベントハンドラーを無効にするため、解決策ではないと思います。

解決策は、UIScrollView内のUIViewのコンポーネントに対して行われたタッチを、UIViewControllerClassに送信する必要があることだと思いますが、これを行う方法が見つかりませんでした。

誰かが私を助けてくれるなら、私はとても感謝しています。前もって感謝します。


[編集#1:鄭による回答]

タップジェスチャでは、cancelsTouchesInViewオプションを[〜#〜] no [〜#〜]に設定する必要があります。

上記の私の場合、この行はすべてを解決します。

touch.cancelsTouchesInView = NO;

鄭に感謝します。

13
uerceg

これがうまくいくかどうかはわかりませんが、scrollview内のビューのタッチイベントに関する回答をここに示します。

IScrollViewでキーボードを閉じる

アイデアは、スクロールビュー領域内のすべてのタップジェスチャを飲み込まないように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];
}
18
Zhang

UIScrollViewをサブクラス化し、システムによって呼び出されるメソッド- hitTest:withEvent:をオーバーライドして、イベントを処理するビューを決定できます。呼び出されるたびに、スクロールビュー内でタッチイベントが発生したと見なすことができ、スーパー実装を呼び出すことで、通常はイベントを処理するビューを取得できます。

3
Guillaume

uIscrollViewであらゆる種類のジェスチャをキャプチャできます。 cancelsTouchesInViewプロパティをfalseに設定するなど、いくつかのデフォルトプロパティも処理するようにしてください。これは、デフォルトではtrueです。また、セレクターで区別するために、サブビューにいくつかのタグ番号を付けます。 &また、ユーザーインタラクションをtrueに有効にします。

タップ= UITapGestureRecognizer(ターゲット:自己、アクション:

セレクター(didTapByUser(_ :)))

0
Aks