[ios] iPhone : 슬라이더 드래그 끝을 감지하는 방법은 무엇입니까?

사용자가 슬라이더 포인터의 드래그를 종료했을 때 이벤트를 감지하는 방법은 무엇입니까?



답변

드래그 사이에 데이터가 필요하지 않은 경우 간단히 설정해야합니다.

[mySlider setContinuous: NO];

이렇게 valueChanged하면 사용자가 슬라이더 이동을 중지 할 때만 이벤트 를 받게 됩니다.

Swift 5 버전 :

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에서 작업에 보낸 사람과 이벤트 매개 변수를 모두 추가 할 수도 있습니다.


답변

“내부 손질”및 “외부 손질”알림을 사용합니다.

인터페이스 빌더 :

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.


답변

Swift 5 및 Swift 4

  1. touchUpInsidetouchUpOutside이벤트에 대한 대상을 추가하십시오 . 프로그래밍 방식으로 또는 스토리 보드에서 수행 할 수 있습니다. 이것이 프로그래밍 방식으로 수행하는 방법입니다.

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
  2. 슬라이더 드래그 끝을 처리하는 함수 작성

    func sliderDidEndSliding() {
        print("end sliding")
    }
    


답변

당신이 사용할 수있는:

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

UISlider에서 touchDown 및 touchUp 이벤트가 발생하는시기를 감지합니다.


답변

제어 이벤트가 필요하다고 생각합니다 UIControlEventTouchUpInside.