10

私は身体障害者向けのアプリに取り組んでいます。テストでは、デフォルトのタッチドラッグ機能に多くの問題があることがわかりました.

UIScrollView にアイコンのグリッドがある画面があります。アイコンをタッチしてアクティブにすることができます。また、アイコン上を含むグリッド内の任意の場所にタッチ アンド ドラッグして、グリッドをスクロールし、他のアイコンを表示することができます。

iOS では、デフォルトの動作は、1 回の動作でタッチしてドラッグすることです。これにはある程度の物理的な調整が必要であり、タッチして一時停止してからドラッグするか、コースから少しずらしてドラッグすると、システムはこれを単純なタッチとして扱います。したがって、テスターは次のようなことを行っています。

  • タッチし、しばらく停止してから、ドラッグしてみます。グリッドはスクロールしません。アイコンをドラッグしてスクロールしようとした場合、タッチを離すと、代わりにアイコンがアクティブになります。

  • タッチして、垂直方向 (サポートされている唯一の方向) にドラッグしてみますが、最初は少し水平方向に向きを変えてください。上記と同じ結果です。

問題は、タッチ処理をオーバーライドして、遅さやドラッグの不正確さに対する許容度を高めて、アプリが上記のアクションをスクロール要求として正しく解釈する方法はあるのでしょうか?

4

5 に答える 5

3

UILongPressGestureRecognizer ( http://developer.apple.com/library/ios/#documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html ) を使用する必要があります。

  • maximumPressDuration を非常に短い値 (例: 10) に設定します。
  • allowableMovement を非常に大きな値 (500 など) に設定します。

...これで、ぐらついたプレスなどに対して「寛容」なジェスチャができました。私はこれを未就学児/幼児向けのいくつかのアプリで使用しましたが、非常にうまく機能します。

Re: スクロール ロジック、UIScrollView はプログラムで簡単に制御できます。UIScrollView とすべての「デリゲート」クラスのドキュメントを読めば、UILongPressGestureRecognizer ジェスチャのコールバックを通じて「制御」するために必要なものがすべて見つかるはずです。

注: カスタム GestureRecognizer を記述する必要はありません。Apple の UILongPressGestureRecognizer がすべての作業を行い、ジェスチャが移動したときにコールバックを返します。あなたはそれに答えるだけです。

于 2013-04-03T16:42:54.737 に答える
3

まず、UIkit のタッチ メカニズムがどのように構築されているかを理解するために、このガイド全体を (必要に応じて 2 回または 3 回) 読んでください。ユーザーが として考えるもの、touchイベントが基礎となるハードウェアとどのように相互作用するか、すべてのオブジェクトがそれをインターセプトする方法、および既存の UIkit タッチ インターフェイスをニーズに合わせて微調整する方法 (少なくとも概念的には) が含まれます。

見逃してはならない私の注意を引いたのは、これtimestampも、特に、 、phaseなどのプロパティpreviousLocationInViewです。(あまり人気のないものだけを挙げています)。

最終的にはわかりませんが、ニーズに合わせてカスタマイズされた独自のカスタムジェスチャ認識エンジンを作成することになる可能性があります。

アップデート:

要件とはあまり関係ありませんが、これは初心者にとっては良い出発点です。

于 2013-03-23T18:16:19.923 に答える
1

サブクラス化せずにジェスチャ認識の動作をカスタマイズする方法は多数あります。

一部の集団に適した簡単な方法は、ユーザーにSettings>General>Accessibility>AssistiveTouchでカスタム ジェスチャを構成させることです。このようにして、たとえば、垂直方向のパンを記録して、有効なときに補助タッチ メニューをタップすることで使用できます。

残りは、それ以上の制御が必要であることを前提としています。

requireGestureRecognizerToFail :を見てください。このメソッドを使用すると、サブクラス化せずにジェスチャ レコグナイザーに優先順位を付けることができるため、たとえば、タップが認識される前にパン ジェスチャが失敗する必要があります。

スクロール ビューのジェスチャ レコグナイザーは、UIScrollView のプロパティとしてアクセスできます。UIGestureRecognizerDelegateを実装することもできます。3つのメソッドのいずれかで動作調整できます

考慮すべきもう 1 つのアプローチは、各ジェスチャに必要なタッチ数をカスタマイズすることです。いずれかのジェスチャの最小値を 2 に設定すると、タッチが 1 回だけの場合にもう一方の認識エンジンのみが呼び出されるようになります。

非常に低レベルの制御の場合、UIApplication または UIWindow をサブクラス化して、ジェスチャ認識エンジンへのタッチ配信をインターセプトできます。

対象とする母集団が同一の機能を持っていない可能性があることを考えると、プリファレンス設定を使用してこれらの調整を構成し、ユーザーに合わせられるようにすることをお勧めします。これは実際には、システム レベルで設定された一連のグローバル設定である必要があります。おそらく、上記のアクセシビリティ設定で設定されているはずです。そのため、Apple にバグを報告し、必要な調整と、提供できる参照情報を正確に説明することをお勧めします。 .

于 2013-04-06T04:46:16.523 に答える
0

もちろん、カスタムのタッチジェスチャレコグナイザーを使用して、touchDidBeginやshouldRecieveTouchなどのタッチジェスチャレコグナイザーデリゲートメソッドをキャプチャすることもできます。正確な表現は覚えていません。カスタムタッチジェスチャレコグナイザーとタッチジェスチャレコグナイザーデリゲートを検索するだけです。

于 2013-03-23T18:01:04.570 に答える
0

デフォルトのUIScrollViewスクロールは正しいことがわかりましたが、問題は単純に、ユーザーがボタンに触れると、ScrollView ではなくボタンが touch イベントを取得することであり、これが私を混乱させていました。

したがって、私がたどり着いたこの問題の解決策は、ボタンを無効にしてから ScrollView がタッチを受け取ることでした。次に、メソッドUIScrollViewを実装するカスタム サブクラスを使用します。これらのメソッドでは、ユーザーがタッチした場所とタッチした場所を記録し、これらが互いに近く、(無効な) ボタンの上にある場合は、そのボタンが実行するアクションを実行します。TouchesBeganTouchesEnded

これは完璧に機能しますが、確かに必要以上の作業だと思います。だから多分私の質問は次のとおりです:ボタンを有効のままにして、スクロールビューがサブビューの前にタッチイベントを取得し、必要に応じてスクロールし、イベントをサブビューに中継する方法はありますか?

于 2013-04-08T13:34:03.437 に答える