8

内部にいくつかのコンテンツビューを持つカスタム UIScrollView サブクラスがあります。それらのいくつかには、UITapGestureRecogniser があります。スクロール ビューがスクロールしていない場合、すべて正常に動作します。ただし、コンテンツ ビューをスクロールすると、タップ アクションは受信されません。スクロールビューがスクロールしているときにサブビューでタップアクションを処理する最も簡単なソリューションは何ですか?

詳細:

MyScrollView横にスクロールします。多くのコンテンツ ビュー (例MyContentView) が含まれています。それぞれMyContentViewの幅は幅の約 3 分の 1MyScrollViewです。したがって、一度に表示MyContentViewされる要素は約 3 ~ 4 個です。の主な動作MyScrollViewは、1) スクロール後にMyContentView要素の 1 つが画面の中央にあることを確認し、2)MyContentViewユーザーがタップした場合に中央にスクロールすることです。したがって、私が得たい主な答えは、減速MyContentView中にタップアクションの処理を「適切に」実装する方法です。MyScrollView

同じ質問と回答をいくつか見つけましたが、満足できるものはありませんでした。gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:UITapGestureRecogniser デリゲートを実装するのが最善でした。しかし、この場合、私は時々(タップするときに、smaaaalドラッグして指を離すと、タップが鋼鉄で認識できるようになります(準タップと呼びます))、タップイベントとスクロールイベントの両方があり、スクロールビューがスクロールしていなくてもバグが発生しますタップを開始すると。ユーザーが準タップを行うと、アプリケーションはタップされた要素にスクロールしようとしMyContentView、すぐに通常のスクロールを処理します。タップを処理した後に他の機能が実行を開始するため、さらにひどいようです(通常のスクロール時には実行してはなりません)。

スクロールビューがタップイベントではないと判断するのに十分なだけ待ってからスクロールするソリューションが必要です。それ以外の場合、タップ イベントがスクロールを認識した場合は、スクロールが発生してはなりません。

4

2 に答える 2

5

@protocolを使用して、カスタム デリゲート メソッドを使用することもできます。UIScrollView が追加されたビュー コントローラーでこれらのデリゲート メソッドを実装します。

MyContentViewのように:

touchesBeganメソッドでは、

[self.delegate contentViewTapped:self];

スクロール ビューが追加された ContainerView クラスで、そのメソッドを実装します

 - (void)contentViewTapped:(MyContentView *)myContentView {

NSLog (@"ContentView no: %d", myContentView.tag); // if tag has been set while adding this view to scrollview.
}

@protocolの例を見てください。

これがあなたが要求したものであることを願っています。

コーディングをお楽しみください :)

于 2012-07-24T15:42:45.773 に答える
4

これは組み込まれています - プロパティとプロパティUIScrollViewを見てください。これにより、タップ後に少しドラッグする際の問題が軽減されます。delaysContentTouchescanCancelContentTouches

これはすべてシステムに組み込まれた動作です。アプリがユーザーの電話で場違いに感じないように、Apple がインターフェイスの感触 (たとえば、小さなドラッグにどのように反応するか) について提供したものに固執することをお勧めします。

編集:

または、ジェスチャ認識エンジンでスクロール ビューのスクロールを無効にし、終了/キャンセルしたら再度有効にすることもできます。

さらに編集: わかりません -ジェスチャ認識デリゲート メソッドを使用して、スクロール ビューのサブビューでタッチをインターセプトする方法を示すサンプル プロジェクトを作成しました。スクロール ビューの「キャンセル可能なコンテンツ タッチ」および「遅延コンテンツ タッチ」プロパティに細心の注意を払ってください。どちらもYES非常に重要な理由があります。

ユーザーがタップ、疑似タップ(あなたが言うように)、またはスクロールビューのパンを試みているかどうかを判断するまで、スクロールビューはコンテンツのタッチを遅らせる必要があります。Apple は、構築しようとしている機能を既に作成しています。UIScrollViewすでにあなたが望むことをします。

問題は、スクロール ビューのスクロール中にスクロール ビューのサブビューがタップ イベントをインターセプトすることをシステムが望んでいないことです。この目的のために、ユーザーが実際にパンしようとしていると判断した場合は、タッチ イベントをキャンセルします。「Delays Content Touches」を設定すると、この動作が有効になります。オンになっていることを確認してください。問題ありません。

于 2012-07-24T11:30:29.710 に答える