0

以前のビューに戻ることができるビューがあります。

これがアンケートだとしましょう。したがって、私のメイン ビューは QuestionnaireView(Controller) であり、2 つの可能な回答を持つ質問を示すサブビューがあります。質問に答えると、次を押すと、アンケート ビュー (コントローラー) はその特定のサブビューに次の質問を表示します。シンプルですね。

さて、特定の質問に対して最大 10 個の回答に対応しなければならないことを想像してみてください。これには、質問とすべての回答に対応するために、サブビューにスクロールビューを実装する必要があります。

ここで私の質問: QuestionnaireView(Controller) に水平方向のスワイプ (次/前の質問) の通知を受け取りたいのですが、他のすべてのタッチ (回答のラジオボタンの場合はタップ、スクロールビューの場合は垂直方向のスワイプ) を通過させます。 ..

これについてどうすればいいですか?私は約5つの異なるアプローチを試しましたが、それぞれに頭とモチベーションを壊しました:/最後の1つ(そして最も単純なもの)は、質問+回答ビューをオーバーレイする別のサブビューをアンケートビュー(コントローラー)に追加するだけでした.

これは私のためにすべての touchesBegan/Moved/Ended/Cancelled を親切にキャッチしますが、それらのメソッド ([self nextResponder] ...) の -each - にフォワードを入れただけでも、基礎となるビュー (回答とスクロールビューを含む) ) もう反応しません...

UIScrollView は iPhone 開発者が直面する最も恐ろしいモンスターなので、私はこれでちょっと迷っており、いつか自分の Scrollview を書くことを考えています :P

iPhone OS 3.0 以降をサポートしているため、新しいジェスチャ API は使用できません。

4

1 に答える 1

1

「これらのメソッドのそれぞれの転送」の意味がわかりません。nextResponder がそれらを転送する正しいものかどうかはわかりません。

問題は、タッチが存続期間中、単一のビューによって「所有」されることになっていることです。UIScrollView やジェスチャ レコグナイザがどのように実装されているかはわかりませんが、自分で行うことになっている以上のことを行うことは確かです。

hitTest:withEvent:QuestionnaireView のto をオーバーライドしますreturn self。touchesBegan:withEvent: で、[super hitTest:[touch locationInView:self] withEvent:event]それを「所有する」サブビューを呼び出して保存します。touchesMoved:withEvent: では、タッチを関連するサブビューに転送しますが、ジェスチャーを検出した場合は、タッチを所有するサブビューを「忘れ」、代わりに touchesCancelled:withEvent: を呼び出します。touchesEnded/Cancelled:withEvent: で、それをサブビューに転送してから、所有しているサブビューを忘れます。

厄介ですが、ほとんどの場合機能します。いくつかの間違いがあります (サブビューの観点から):

  • -[UIEvent touchesForView:] は QuestionnaireView を返します。
  • UITouch.view は QuestionnaireView を返します
  • UITouch.phase は touchesCancelled:withEvent: で UITouchPhaseCancelled でない可能性があります (ジェスチャーを検出してタッチをキャンセルした場合)。*
于 2010-08-12T19:10:24.923 に答える