14

サーフェス全体 (1024 x 768) に配置された UIScrollView を含むシンプルなストーリーボード IPad プロジェクトに UIViewController があります。アプリケーションがviewDidLoadで開始時にロードするUIViewである3つのXIBファイルを作成し、それらをUIScrollViewに追加しました。これら 3 つの XIB ファイルにはそれぞれ、UIButton が 1 つだけ含まれています。

これは階層です:

~ UIViewController ( UIViewControllerClassはこの UIViewController のクラスです)

~~ UIScrollView (3 つの同一の UIView を含む)

~~~ UIView ( UIViewClassは、この XIB ファイルのファイルの所有者です)

~~~~ UIボタン

私の 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: Zheng による回答]

タップ ジェスチャはcancelTouchesInViewオプションをNOに設定する必要があります。

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

touch.cancelsTouchesInView = NO;

鄭氏に感謝します。

4

3 に答える 3

18

これがうまくいくかどうかはわかりませんが、スクロールビュー内のビューのタッチイベントに関する回答は次のとおりです。

UIScrollView でキーボードを閉じる

アイデアは、スクロール ビュー領域内のすべてのタップ ジェスチャを飲み込まないように 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];
}
于 2012-09-03T08:55:10.133 に答える
3

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

于 2012-09-03T08:10:50.533 に答える