2012-06-27 9 views
16

私は現在、UIScrollViewを使用して、アプリケーションに表示しているグラフのカーソル/マーカーをスクロール/ドラッグする方法として機能しています。私はscrollViewDidScrollなどを使用してcontentoffsetの位置を検出し、この位置に基づいて画面上に表示するものを操作します。iosでは、ユーザーがドラッグアンドスクロール機能を提供しながら、1回のタップを検出することが可能ですか?

私の質問は、画面上のユーザーのシングルタップを検出して、このタップの位置を取得することが可能な場合です(contentoffsetをこの位置に設定することです)。

私はuiscrollviewのサブクラスの作成について説明しているチュートリアルを読んでいますが、これらのサブクラスは1回のタップだけを考慮し、ドラッグ/スクロールも考慮しないようです。

私のUIScrollViewでユーザーのシングルタップを検出しても、スクロール/ドラッグ機能を持つことができる人はいますか?
ありがとうございます!

+0

UIScrollViewsのための一般的であるかの方法ではない台無しにユーザはそれらと対話する。 Appleは理由のためにそれらを作成しました。異なる動作が必要な場合は、独自のビューを作成します。それを除けば、タップを検出したいという理由で私は本当に明確ではありません。ユーザーがスクロールビューをタップすると、contentOffsetをタップ位置に設定するとしますが、contentOffsetはスクロールビュー内で表示できるコンテンツの左上隅を示しています。どういう意味ですか? – WendiKidd

+0

はい、contentoffsetは、画面上のスクロールビューがどこにあるかを判断する方法です。言い換えれば、contentoffsetは、ユーザーがスクロールビューのどれくらい下がっているかを示すマーカーのようなものです。したがって、私は、スクロールビュー(別名、contentoffset)の位置に基づいてラベルのテキストを変更します。_So、ユーザーがscrollview_ –

答えて

30

使用あなたのscrollViewオブジェクトのための次のコード:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTapGestureRecognizer]; 
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project 

}

- (void)singleTap:(UITapGestureRecognizer *)gesture { 
//handle taps 
} 
+0

haha​​、this私が思いついた解決策(まあ、ほぼ正確に)です!とにかくありがとう! –

+0

実際には、numberOfTapsRequiredとしてcancelsTouchesInViewだけを設定する必要があり、デフォルトでは1とYESに設定されています。https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/ – dnlcrl

+0

最近、UITapGestureRecognizerストーリーボードに入れて、はるかに短いコードのアクションをドラッグします。 –

0

UITapGestureRecognizerをscrollViewに添付しましたか?私はUITcGestureRecognizerをUIScrollViewに添付して、タッチが必要なときに組み込みパンをキャンセルするために–gestureRecognizerShouldBegin:および/または–gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:を使用しました。

1

質問の最初の部分はかなり簡単です。あなたはUIScrollViewのサブクラスを持っている場合、あなたはこのようになりますtouchesEndedオーバーライド追加することができます:スクロールビューの場合

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

     CGPoint location = [touch locationInView:self]; 

     [self setContentOffset:location animated:YES]; 

    } 


} 

を、タッチ用-locationInViewは、実際にすでにContentOffsetがそれに追加されます。このコードが行うことは、ユーザーがタッチしたポイントがビューの左上になるようにスクロールビューをスクロールすることです。これはおそらく正確には望んでいないので、スクロールを10ピクセルアップさせたい場合はオフセットを追加するか、x値だけを使って別のCGPointをあなたのスクロールが左から右でない場合は、場所。

これは実際にスクロールすることを妨げません。

+0

をタップした場所に基づいてcontentoffsetを設定/更新したい場合は、UIGestureRecognizerを使用していない時にはこれが素晴らしいです(ほとんどの場合、私にとってはほとんどの時間のようです) –

6

スウィフト3

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:))) 
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1 
scrollViewTapGestureRecognizer.isEnabled = true 
scrollViewTapGestureRecognizer.cancelsTouchesInView = false 
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer) 

func scrollViewTapped(_ sender: UITapGestureRecognizer) { 
    print("UIScrollView was tapped.") 
} 
関連する問題