2

次のようにレイアウトされたビュー階層があります。

parentView

 scrollView

    contentViewA

    containerView

         contentViewB

         contentViewC

contentViewBがタッチに応答するようにしたい。残念ながら、scrollViewはタッチ自体を取り込もうとするため、これをほぼ不可能にし、contentViewBのタッチ応答をむらにします。

したがって、代わりに、parentView内のすべてのタッチをインターセプトし、contentViewBを直接操作してから、そのタッチをscrollViewに渡して、その処理を実行できるようにします。

誰かがこれをやってのける正しい方法を教えてもらえますか?

前もって感謝します。

乾杯、ダグ

アップデート:

もう少し掘り下げてみたところ、不思議に機能しているように見えるプロパティcanCancelContentTouchesが見つかりました。IBを使用しているので、IBの[キャンセル可能なコンテンツタッチ]のチェックを外しました。これは、スクロールビュー属性インスペクターの最初のタブです。これで、アプリを実行すると、タッチがcontentViewBに確実に到達しているように見えます。

UIScrollViewドキュメントでこのプロパティを説明する方法は次のとおりです。

ディスカッションこのプロパティの値がYESで、コンテンツ内のビューがそれに触れている指の追跡を開始し、ユーザーが指をドラッグしてスクロールを開始した場合、ビューはtouchesCancelled:withEvent:メッセージを受け取り、スクロールビューはハンドルを処理しますスクロールとしてのタッチ。このプロパティの値がNOの場合、コンテンツビューが追跡を開始すると、指の動きに関係なくスクロールビューはスクロールしません。

かなり不透明ですね とにかく、それはうまくいくようです。

4

2 に答える 2

2

スクロールビューがタッチイベントをインターセプトしないようにするには、userInteractionEnabledプロパティを次のように設定します。

scrollView.userInteractionEnabled = NO;
于 2009-11-04T14:07:44.753 に答える
1

これを行う別の方法は、UI に別のサブビューを追加して、次のようにすることです。

parentView
  scrollView
    contentViewA
      containerView
        contentViewB
        contentViewC
  touchGrabber

そして、touchGrabber で、(UIView をサブクラス化することによって) 必要なすべてのタッチを検出します。

これはPhil Nashのソリューションよりも複雑ですが、他のビューを追加/削除できるという利点があります。たとえば、ビューを追加するサードパーティのライブラリがある場合に役立ちます。

ただし、間違いなくscrollViewのみを使用する場合は、Phil Nashの答えが前進です!

ありがとう、

サム

于 2009-11-04T14:31:29.447 に答える