10

UIPanGestureRecognizer が接続された UIView がありますが、ジェスチャは正常に機能していますが、開始点がパンが最初に開始された場所ではないことを除いて、通常は x 座標と y 座標の両方で 5 ~ 15 ピクセルずれています。残念ながら、分散はそうではありません。一貫しており、パン動作が発生する速度に関連しているようです。

タッチが正しく送信されていることを検証するために、サブビューに touchesBegan メソッドを追加しました。正しい開始点を受け取りますが、ジェスチャは開始フェーズで同じ点を提供しません。私のログのいくつかの例は以下のとおりです。'Line start point' は、ジェスチャ認識エンジンから受け取った最初のポイントです。

touchesBegan got point 617.000000x505.000000
Line start point at 630.000000x504.0000001
touchesBegan got point 403.000000x503.000000
Line start point at 413.000000x504.000000 
touchesBegan got point 323.000000x562.000000
Line start point at 341.000000x568.000000

誰もこの問題を見たことがありますか?

まったく新しい UIGestureRecognizer を実装せずに問題を回避する方法についてのアイデアはありますか?

4

6 に答える 6

8

ジェスチャ レコグナイザーのデリゲート メソッドを使用して、ジェスチャの最初のタッチ位置を検出できます。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
于 2014-02-06T13:43:02.957 に答える
4
  CGPoint beg = [panRecognizer locationInView:_scrollView];
  CGPoint trans = [panRecognizer translationInView:_scrollView];
  CGPoint firstTouch = CGPointSubtract(beg, trans);

このコードを UIGestureRecognizerStateBegan ケースに入れます

于 2012-12-15T20:00:46.417 に答える
3

はい、違いは、ジェスチャ レコグナイザがアクティブになる前に不定の移動距離を待機するためです。できることは、独自の UIPanGestureRecognizer を作成し、touchesMoved オーバーライド メソッドで状態を UIGestureRecognizerStateChanged に設定することです。

注: touchesBegan の代わりに touhcesMoved を使用しました。これは、ユーザーのタッチが即座にではなく移動したときに開始するようにしたかったためです。

これを行うカスタム ジェスチャ レコグナイザのコード例を次に示します。

#import "RAUIPanGestureRecognizer.h"

@implementation RAUIPanGestureRecognizer 


#pragma mark - UIGestureRecognizerSubclass Methods

- (void)reset
    { [super reset ]; }

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    { [super touchesBegan:touches withEvent:event ]; }

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    { 
        [self setState:UIGestureRecognizerStateChanged ];
        [super touchesMoved:touches withEvent:event ]; 
    }

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    { [super touchesEnded:touches withEvent:event ]; }

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    { [super touchesCancelled:touches withEvent:event ]; }


@end
于 2012-08-01T14:12:15.227 に答える
3

ドキュメントには、指が「パンと見なされるのに十分なほど動いた」ときにパン ジェスチャが開始されると記載されています。この動きは、ドラッグとプレスを区別するためのものです。これは、ユーザーがドラッグせずにプレスしようとしている間に、ユーザーの指が少し動く可能性があるためです。

これが、最初のタッチ ポイントとドラッグの一部と見なされる最初のポイントの間で見られる違いだと思います。

于 2010-08-08T18:08:01.857 に答える
1

これを回避するには、ジェスチャ認識エンジンの開始時に翻訳ポイントをリセットしてみてください。たとえば、次のようにアクション メソッドを開始します。

- (void)panGesture:(UIPanGestureRecognizer *)recognizer;
{
    if ( recognizer.state == UIGestureRecognizerStateBegan )
    {
        CGPoint point = ...; // The view's initial origin.
        UIView *superview = [recognizer.view superview];
        [recognizer setTranslation:point inView:superview];
    }
}
于 2012-01-27T21:06:06.220 に答える