ユーザーがスライダーポインターのドラッグを終了したときにイベントを検出する方法
ユーザーがスライダーポインターのドラッグを終了したときにイベントを検出する方法
回答:
ドラッグの間にデータが必要ない場合は、単に設定する必要があります。
[mySlider setContinuous: NO];
この方法ではvalueChanged
、ユーザーがスライダーの移動を停止したときにのみイベントを受け取ります。
Swift 5バージョン:
mySlider.isContinuous = false
Events [x] Continuous Updates
UISliderViewの設定があります。これをオフにするcontinuous
と、false / NOに設定されます。
self.mySlider.isContinuous = false
UIControlEventValueChangedの送信者とイベントの2つのパラメーターを取るアクションを追加できます。
[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;
}
}
Swift 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でアクションを追加するときに、アクションに送信者パラメーターとイベントパラメーターの両方を追加するオプションもあります。
isContinuous = true
することを忘れないでくださいUISlider
。
「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:
タッチが終了するとメッセージが送信されます。
ペン先で行う場合は、スライダーをコントロールクリックして接続メニューを表示し、「Touch Up Inside」ソケットからターゲットオブジェクトにドラッグします。
あなたはまたのためのターゲットとアクションを追加しなければならないUIControlEventTouchUpOutside
とのためにUIControlEventTouchCancel
。
UISlider
この回答を書いてから、の動作が変わりました。
UIControlEventTouchCancel
のiOS 9にハンドラしかし、私は呼び出すことができるよUIControlEventTouchUpInside
とUIControlEventTouchUpOutside
だけ。
イベントのターゲットを追加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
。
スウィフト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")
}
}
スライダーのドラッグイベントを継続的に発生させたい場合がありますが、スライダーがまだドラッグされているか、ドラッグが終了した直後かによって、異なるコードを実行するオプションがあります。
これを行うために、スライダーのisTracking
プロパティを利用する上記のアンディの答えを拡張しました。との2つの状態を記録する必要がsliderHasFinishedTracking
ありましたsliderLastStoredValue
。
私のコードは正しく:
ドラッグ開始時にアクションを起動しません
ユーザーが1回のタップでスライダーを動かしただけの場合にアクションを起動します(つまり、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つの最初のステップ:-スライダーにターゲットを追加する
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 2番目のステップ:-関数を作成する
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->\(distanceSlider.value)")
}
最近同様の問題がありました。これが私が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);
}