ユーザーがスライダーポインターのドラッグを終了したときにイベントを検出する方法は?
ドラッグ間のデータが必要ない場合は、単に設定する必要があります。
[mySlider setContinuous: NO];
この方法では、ユーザーがスライダーの移動を停止したときにのみvalueChanged
イベントを受け取ります。
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では、アクションを追加するときに、送信者とイベントの両方のパラメーターをアクションに追加するオプションもあります。
「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");
}
UISlider
はUIControl
のサブクラスであるため、そのUIControlEventTouchUpInside
のターゲットとアクションを設定できます。
コードで実行したい場合は、次のようになります。
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
dragEndedForSlider:
タッチが終了したときのメッセージ。
ペン先でそれを行いたい場合は、スライダーをControlキーを押しながらクリックして接続メニューを取得し、「Touch Up Inside」ソケットからターゲットオブジェクトにドラッグします。
UIControlEventTouchUpOutside
およびUIControlEventTouchCancel
のターゲットとアクションも追加する必要があります。
touchUpInside
およびtouchUpOutside
イベントのターゲットを追加します。プログラムで、またはストーリーボードから行うことができます。これはプログラムで行う方法です
slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
スライダードラッグの終了を処理する関数を記述します
func sliderDidEndSliding() {
print("end sliding")
}
次を使用できます。
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
uISliderでtouchDownイベントとtouchUpイベントがいつ発生するかを検出する
制御イベント UIControlEventTouchUpInside
が必要だと思います。
場合によっては、スライダーのドラッグイベントを継続的に発生させたいが、スライダーがまだドラッグされているか、ドラッグが終了したかによって異なるコードを実行するオプションがあります。
これを行うために、スライダーの isTracking
プロパティを利用する上記のAndyの答えを拡張しました。 sliderHasFinishedTracking
とsliderLastStoredValue
の2つの状態を記録する必要がありました。
私のコードは正しく:
ドラッグ開始時にアクションを起動しません
ユーザーがシングルタップでスライダーを少しだけ動かした場合にアクションを起動します(つまり、isTracking
はfalse
のままです)
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
}
}
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)")
}
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")
}
}
たぶん、UIControlEventTouchUpInside、UIControlEventTouchUpOutside、UIControlEventTouchCancelイベントのターゲットを追加する必要があります。
IControlEventTouchCancelイベントのターゲットを追加しないため、以前同じ問題に遭遇しました。
最近似たような問題がありました。これが私が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に設定すると、必要な処理が行われます。
こうやって
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);
}