사용자가 슬라이더 포인터의 드래그를 종료했을 때 이벤트를 감지하는 방법은 무엇입니까?
사용자가 슬라이더 포인터의 드래그를 종료했을 때 이벤트를 감지하는 방법은 무엇입니까?
답변:
드래그 사이에 데이터가 필요하지 않은 경우 간단히 설정해야합니다.
[mySlider setContinuous: NO];
이렇게 valueChanged
하면 사용자가 슬라이더 이동을 중지 할 때만 이벤트 를 받게 됩니다.
Swift 5 버전 :
mySlider.isContinuous = false
self.mySlider.isContinuous = false
UIControlEventValueChanged에 대해 두 개의 매개 변수 (발신자 및 이벤트)를 취하는 조치를 추가 할 수 있습니다 .
[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
.
"내부 손질"및 "외부 손질"알림을 사용합니다.
인터페이스 빌더 :
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
아이폰 OS 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
속성을 사용하는 위의 Andy의 답변을 확장 했습니다. 두 가지 상태를 기록해야했습니다 : sliderHasFinishedTracking
및 sliderLastStoredValue
.
내 코드를 올바르게 :
드래그를 시작할 때 액션을 실행하지 않습니다.
사용자가 한 번의 탭으로 슬라이더를 조금만 이동하면 액션이 실행됩니다 (이는 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에서는이 기능을 사용할 수 있습니다.
첫 번째 단계 :-슬라이더에 대상 추가
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
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);
}