サーフェス全体 (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;
鄭氏に感謝します。