web-dev-qa-db-ja.com

iPhone:スライダーのドラッグの終了を検出する方法は?

ユーザーがスライダーポインターのドラッグを終了したときにイベントを検出する方法は?

79
DroidHeaven

ドラッグ間のデータが必要ない場合は、単に設定する必要があります。

[mySlider setContinuous: NO];

この方法では、ユーザーがスライダーの移動を停止したときにのみvalueChangedイベントを受け取ります。

147
Rok Jarc

UIControlEventValueChangedに対してtwoパラメーター、送信者、イベントを受け取るアクションを追加できます。

[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]

次に、ハンドラーでタッチオブジェクトのフェーズを確認します。

- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {     
    UITouch *touchEvent = [[event allTouches] anyObject];
    switch (touchEvent.phase) {     
        case UITouchPhaseBegan:
            // handle drag began
            break;
        case UITouchPhaseMoved:
            // handle drag moved
            break;
        case UITouchPhaseEnded:
            // handle drag ended
            break;
        default:
            break;
    }
}

スイフト4および5

slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {
    if let touchEvent = event.allTouches?.first {
        switch touchEvent.phase {
        case .began:
            // handle drag began
        case .moved:
            // handle drag moved
        case .ended:
            // handle drag ended
        default:
            break
        }
    }
}

Interface Builderでは、アクションを追加するときに、送信者とイベントの両方のパラメーターをアクションに追加するオプションもあります。

81
pinch

「Touch Up Inside」および「Touch up Outside」通知を使用します。

インターフェイスビルダー:

Interface Builderの両方の通知を受信方法に接続します。メソッドは次のようになります。

- (IBAction)lengthSliderDidEndSliding:(id)sender {
    NSLog(@"Slider did end sliding... Do your stuff here");
}

コード内:

プログラムで配線したい場合は、viewWillAppear(または適切な場所)の呼び出しで次のようなものを呼び出します。

[_mySlider addTarget:self
              action:@selector(sliderDidEndSliding:) 
    forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];

受信方法は次のようになります。

- (void)sliderDidEndSliding:(NSNotification *)notification {
     NSLog(@"Slider did end sliding... Do your stuff here");
}
69
thomas

UISliderUIControlのサブクラスであるため、そのUIControlEventTouchUpInsideのターゲットとアクションを設定できます。

コードで実行したい場合は、次のようになります。

[self.slider addTarget:self action:@selector(dragEndedForSlider:)
    forControlEvents:UIControlEventTouchUpInside];

dragEndedForSlider:タッチが終了したときのメッセージ。

ペン先でそれを行いたい場合は、スライダーをControlキーを押しながらクリックして接続メニューを取得し、「Touch Up Inside」ソケットからターゲットオブジェクトにドラッグします。

UIControlEventTouchUpOutsideおよびUIControlEventTouchCancelのターゲットとアクションも追加する必要があります。

16
rob mayoff

Swift 5およびSwift 4

  1. touchUpInsideおよびtouchUpOutsideイベントのターゲットを追加します。プログラムで、またはストーリーボードから行うことができます。これはプログラムで行う方法です

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
  2. スライダードラッグの終了を処理する関数を記述します

    func sliderDidEndSliding() {
        print("end sliding")
    }
    
13
Guy Daher

次を使用できます。

- (void)addTarget:(id)target action:(SEL)action 
                   forControlEvents:(UIControlEvents)controlEvents  

uISliderでtouchDownイベントとtouchUpイベントがいつ発生するかを検出する

10
Mudit Bajpai

制御イベント UIControlEventTouchUpInside が必要だと思います。

7
scorpiozj

Swift 3.1

場合によっては、スライダーのドラッグイベントを継続的に発生させたいが、スライダーがまだドラッグされているか、ドラッグが終了したかによって異なるコードを実行するオプションがあります。

これを行うために、スライダーの isTracking プロパティを利用する上記のAndyの答えを拡張しました。 sliderHasFinishedTrackingsliderLastStoredValueの2つの状態を記録する必要がありました。

私のコードは正しく:

  • ドラッグ開始時にアクションを起動しません

  • ユーザーがシングルタップでスライダーを少しだけ動かした場合にアクションを起動します(つまり、isTrackingfalseのままです)


class SliderExample: UIViewController {
  var slider: UISlider = UISlider()
  var sliderHasFinishedTracking: Bool = true
  var sliderLastStoredValue: Float!

  override func loadView() {
    super.loadView()

    slider.minimumValue = 100.0
    slider.maximumValue = 200.0
    slider.isContinuous = true
    slider.value = 100.0
    self.sliderLastStoredValue = slider.value
    slider.addTarget(self, action: #selector(respondToSlideEvents), for: .valueChanged)
    // add your slider to the view however you like
  }

  func respondToSlideEvents(sender: UISlider) {
    let currentValue: Float = Float(sender.value)
    print("Event fired. Current value for slider: \(currentValue)%.")

    if(slider.isTracking) {
      self.sliderHasFinishedTracking = false
      print("Action while the slider is being dragged ⏳")
    } else {
      if(self.sliderHasFinishedTracking && currentValue == self.sliderLastStoredValue){
        print("Slider has finished tracking and its value hasn't changed, " +
              "yet event was fired anyway. ????") // No need to take action.
      } else {
        self.sliderHasFinishedTracking = true
        print("Action upon slider drag/tap finishing ⌛️")
      }
    }

    self.sliderLastStoredValue = currentValue
  }
}
4
Jamie Birch

接続Touch Up InsideおよびValue Changed

enter image description here

4
Abo3atef

Swift 4では、この関数を使用できます

1 Fristステップ:-スライダーにターゲットを追加

self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))

2第2ステップ:-関数を作成する

@objc func sliderDidEndSliding(notification: NSNotification)
{
   print("Hello-->\(distanceSlider.value)")
}
4
pansora abhay

Swift 3の答え

私は同じ問題を抱えていたが、最終的にはこれが機能するようになったので、誰かの助けになるかもしれない。 your_Sliderをストーリーボードの「Value Changed」に接続し、スライダーが「Slider Touched」アクションに移動したとき、および「Slider Released」を放したとき。

@IBAction func your_Slider(_ sender: UISlider) {
    if (yourSlider.isTracking) {
        print("Slider Touched")
    } else {
        print("Slider Released")
    }
}
4
Andy

たぶん、UIControlEventTouchUpInside、UIControlEventTouchUpOutside、UIControlEventTouchCancelイベントのターゲットを追加する必要があります。

IControlEventTouchCancelイベントのターゲットを追加しないため、以前同じ問題に遭遇しました。

1
zhuoming

最近似たような問題がありました。これが私がSwiftでやったことです:

    theSlider.continuous = false;

この連続値を保持するコードは次のとおりです。

public var continuous: Bool // if set, value change events are generated
    // any time the value changes due to dragging. default = YES

デフォルトはYES(true)のようです。 falseに設定すると、必要な処理が行われます。

1
Evdzhan Mustafa

こうやって

customSlider.minimumValue = 0.0;
    customSlider.maximumValue = 10.0;
[customSlider addTarget:self action:@selector(changeSlider:) forControlEvents:UIControlEventValueChanged];


-(void)changeSlider:(id)sender{
    UISlider *slider=(UISlider *)sender;
    float sliderValue=(float)(slider.value );
NSLog(@"sliderValue = %f",sliderValue);
}
0
Raj Subbiah