11

ユーザーがドラッグを開始したときに、UIScrollView で (最初の) タッチ位置を検出したいと思います。私はこの問題をグーグルで検索しましたが、多くの人がこの問題に苦労しているようです。Apple がユーザーにスクロール ビューでのタッチ情報へのアクセスを許可しない理由については、まだ頭を悩ませることはできませんが、自分で解決策を見つけずにはいられません。しかし、私の試みはすべて失敗したので、あなたに尋ねたいと思います。

これが私がうまくいくと思ったものです:

UIScrollView サブクラスで次のように UIPanGestureRecognizer を設定し、そのジェスチャ認識エンジンに追加します。

UIPanGestureRecognizer *tapDrag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(touchedAndDragged:)];
tapDrag.cancelsTouchesInView = NO;
tapDrag.delegate = self;
[self addGestureRecognizer:tapDrag];  

そして対応する方法:

-(void)touchedAndDragged:(UIPanGestureRecognizer*)t{

     CGPoint loc = [t locationInView:self];
     //do something with location (that is exactly what I need)
     //...

     //Now DISABLE and forward touches to scroll view, so that it scrolls normally
     t.enabled = NO;
     /****
     ?????
     *****/

}

コメントで示されているように、ポイントを取得した後にパンジェスチャを無効にしてから、レコグナイザーを無効にし(まだドラッグしている間!)、スクロールビューにタッチを「渡し」て、ユーザーが正常にスクロールできるようにします。それはまったく実現可能ですか?それに対する他の解決策はありますか?

4

2 に答える 2

34

UIScrollView には、タップできるパン ジェスチャが既に組み込まれています。使用方法は、クラスをスクロール ビューのデリゲートとして設定し (scrollViewWillBeginDragging を利用するため)、UIPanGestureRecognizer の -locationInView: を使用してタッチ位置を特定するだけです。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView];
    NSLog(@"%@",NSStringFromCGPoint(location));
}
于 2013-06-27T14:15:46.853 に答える
0

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)eventより便利で効率的な開始場所を取得してみませんか。

于 2013-06-27T13:39:52.643 に答える