1

特定のビューでシングル/ダブルタップを検出するには、次のようにします。

NSSet *myTouches = [event touchesForView:mySpecificView.view];

しかし、スライダーのボタンのダブルタップを検出したいのですが、それへの参照が見つかりません。スライダーの名前を入力できる「touchesForView:」に代わるものはありますか?

使用法: デフォルト値がスライダーの中央にある 3 つのスライダーがあります。スライダーの位置が変更されたら、各スライダーを個別に既定の位置にすばやくリセットする方法が必要です。

現在、各スライダーを含むビューをダブルタップに応答するように設定し、各スライダーを更新しています。うまく機能しますが、自然ではないようです。つまり、スライダーがタップをインターセプトし、周囲のビューに渡さないため、スライダー自体をダブルタップすることはできません。

前もって感謝します

4

3 に答える 3

1

スライダーの TouchDownRepeat イベントを 1 つ (doubleTapSlider) に接続し、同じスライダーの TouchUpInside イベントを別のスライダー (releaseSliderBtn) に接続する 2 つの方法を利用することで、探していた正確な機能を得ることができました。これは 3 つの個別のスライダーに必要だったので、Interface Builder で 5、6、7 のタグを割り当てて、どのスライダーがメソッドを呼び出しているかを検出しました。

ユーザーがスライダー ボールをダブルタップすると、ボールが中央に戻り、ラベルが 100 に設定されます。ボールは、ユーザーが 2 回目のタップを離した場所にジャンプして戻ります。ここで、ラベルの現在のテキストを確認すると、ユーザーが 2 回目のタップを離しても、ボールは中央の位置に留まります。スライダー 1 の範囲は 50 ~ 150 です。スライダー 2 の範囲は -12 ~ +12 です。スライダー 3 の範囲は -49 ~ +49 です。

参考までに、else if が releaseSliderBtn に対して機能していなかったので、if ステートメントを 3 つに分けました。

-(IBAction)doubleTapSlider:(id)sender {
  printf ("Sender: %d\n", [sender tag]);
  if([sender tag] == 5){
    playbackSpeedSlider.value = 100;
    playbackSpeedLabel.text = @"100";
  } else if ([sender tag] == 6) {
    halfStepSlider.value = 0;
    halfStepLabel.text = @"0";
  } else if ([sender tag] == 7) {
    centsSlider.value = 0;
    centsLabel.text = @"0";
  }
}
-(IBAction)releaseSliderBtn:(id)sender {
  printf ("Sender: %d\n", [sender tag]);
  if([sender tag] == 5){
    if(playbackSpeedLabel.text == @"100"){
      playbackSpeedSlider.value = 100;
    }
  }
  if ([sender tag] == 6) {
    if(halfStepLabel.text == @"0"){
      halfStepSlider.value = 0;
    }
  }
  if ([sender tag] == 7) {
    if(centsLabel.text == @"0"){
      centsSlider.value = 0; 
    }
  }
}
于 2010-05-02T21:27:40.270 に答える
0

あなたの質問に出くわしたとき、UISlider から UITableView にタッチ イベントを渡す方法を探していました。

あなたがまだそれを理解していない場合、または同様の質問をしている他の人のために、アクションメソッドを次のように設定することにより、UISlider オブジェクトのダブルタップを検出できます。

- (void)loadView {

   UISlider *slider = [[UISlider alloc] initWithFrame:sliderBackground.frame];
   [view addSubview:slider];

   // Set the slider action method
   [slider addTarget:self 
           action:@selector(sliderDoubleTap:) 
           forControlEvents:UIControlEventTouchDownRepeat];

}


- (void) sliderDoubleTap: (UISlider *) sender {
    NSLog(@"Slider Double Tap");
}
于 2010-02-25T12:39:30.600 に答える
0

Swift 3.0 用に更新

これは、スライダーをリセットするためにダブルタップ認識機能を追加するというほぼ同じ問題を解決しているときに偶然出くわした古い質問です。

元の回答は、応答するアクションを追加することで、正しい方向に私たちを向けていUIControlEvents.touchDownRepeatます。

これは、View Controller に次の行を追加することで迅速に実行できます (たとえば、次のviewDidLoad()メソッドで:

override func viewDidLoad() 
{     
    super.viewDidLoad()
    self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat)
}

それに応じて、セレクターで応答できます。

@objc func sliderTouchDownRepeat(_ slider: UISlider) 
{       
        //Respond to double tap here
}

これは問題ありませんが、ダブルタップが認識されたときにスライダーの値を変更する予定がある場合は、追加のコードが必要です。

まず、アクションも追加しますUIControlEvents.valueChanged

override func viewDidLoad() 
{     
    super.viewDidLoad()
    self.slider.addTarget(self, action: #selector(sliderTouchDownRepeat(_ :)), for: .touchDownRepeat)
    self.slider.addTarget(self, action: #selector(sliderDidChange(_:)), for: .valueChanged)
}

応答している現在のタッチ ダウン イベントをキャンセルして、スライダーのサムがすぐにダブル タップの場所に戻らないようにslider.cancelTracking(with: nil) し、UIControlEvents.valueChanged

@objc func sliderTouchDownRepeat(_ slider: UISlider) 
{
    slider.cancelTracking(with: nil)

    // Perform your own value change operation
    // self.reset()

    self.sliderDidChange(slider)
}

@objc  func sliderDidChange(_ slider: UISlider) 
{
    //Update any other UI here
}

ハッピーコーディング

于 2016-11-23T00:19:44.387 に答える