3

明確化:

私が達成しようとしているのは、これです。スワイプジェスチャ(上、下、右、左)はWebView上にあります。ジェスチャのいずれかが発生すると、これが発生する必要があります。スワイプが開始されるとすぐに、アクションを開始する必要があります(アクションは、実際には、IPカメラを上下左右に移動するhtmlリンクをロードしています)。htmlリンクを使用すると、カメラを右または左、または上または下に移動できます。ロードされるとIPカメラに停止するように指示する別のhtmlリンクがあります。

したがって、状態がUIGestureRecognizerStateである場合、リンクの読み込みが開始され、ユーザーが画面に触れなくなるまでカメラが継続的に移動し、状態がUIGestureRecognizerStateEndedになり、他のhtmlリンクがトリガーされてWebViewで実行され、そのリンクによってカメラが停止します。動くことから。私たちが話すように、投稿された私の最初のコードはそれを行いますが、スワイプは敏感すぎました。この問題はコードで修正されていますが、2番目のリンクが最初のリンクの直後に読み込まれ、カメラが移動できなくなりました。それは意味がありますか?最初のリンクは、指を離すまで実行する必要があります。


元の質問:

私が管理したUIPanGestureRecognizerで速度を使用してスワイプ方向を決定しようとしましたが、これは右、左、上、下のスワイプを検出し、スワイプ方向に基づいて適切なアクションをトリガーし、UIGestureRecognizerStateEndedがスワイプごとに正しいアクションをトリガーします、しかし、以下のコードでの私の問題は、方向が非常に敏感であるということです。たとえば、右にスワイプしている間は、右にスワイプするほとんどの部分だけでなく、その間に上下にスワイプすることも認識します。スワイプは常に完全に直線であるとは限らないため、スワイプが最も右にある場合にのみ右スワイプのアクションをトリガーし、小さなピクセル偏差を無視することを見つけたいと思います。

また、私のプロジェクトにとって理想的なのは、UISwipeGestureRecognizerのように、特定のスワイプ方向でアクションを1回だけトリガーすることですが、それを使用すると、指を離すまでスワイプアクションが実行されないため、UIGestureRecognizerStateEndedに問題があります。画面では、指がまだスワイプしているにもかかわらず、スワイプアクションがすぐに終了します。

どんな助けでも大歓迎です。これが私のコードです:

ViewDidLoadで私は持っています:

UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[_myWebView addGestureRecognizer:gestureRecognizer];
[gestureRecognizer setMinimumNumberOfTouches:1];
[gestureRecognizer setMaximumNumberOfTouches:1];

そして私のクラスでは:

- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
CGPoint velocity = [gestureRecognizer velocityInView:_myWebView];

if(velocity.x > 0)//right
{
   //my action here

  if ( [gestureRecognizer state] == UIGestureRecognizerStateEnded )
  { //my action when swipe finished here }
}
else if(velocity.x < 0)//left
{
   //my action here

  if ( [gestureRecognizer state] == UIGestureRecognizerStateEnded )
  { //my action when swipe finished here }
}
else if(velocity.y > 0)//down
{
   //my action here

  if ( [gestureRecognizer state] == UIGestureRecognizerStateEnded )
  { //my action when swipe finished here }
}
else if(velocity.y < 0)//up
{
   //my action here

  if ( [gestureRecognizer state] == UIGestureRecognizerStateEnded )
  { //my action when swipe finished here }
}

よろしくお願いします。ご不明な点がございましたらお問い合わせください。

4

2 に答える 2

1

まず、ジェスチャの速度の代わりに平行移動を使用できます。これにより、速度のようにスワイプの最後の移動方向ではなく、スワイプの最初から最後まで移動した距離が得られます。

次に、方向を確認する前に、ジェスチャの状態が「終了」であるかどうかを確認する必要があります。次に、各「if」で同じチェックを繰り返します。

方向を取得するには、変換の x と y で atan2 三角関数を使用して変換の角度を取得するか、ジェスチャーを常に 4 方向のいずれかへのスワイプとして解釈しても問題ない場合は、単に x または y が大きいかどうかを調べます。絶対値、そしてそれが正か負か。

于 2012-12-14T14:17:15.940 に答える