iPhone: स्लाइडर ड्रैग के अंत का पता कैसे लगाएं?


94

जब उपयोगकर्ता ने स्लाइडर पॉइंटर के ड्रैग को समाप्त कर दिया है तो घटना का पता कैसे लगाएं?


1
का उपयोग करें: [स्लाइडर addTarget: स्वयं कार्रवाई: @selector (स्लाइडरस्टॉप्टड्रेगिंग :) forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOpside]
हेनरी सो

जवाबों:


171

यदि आपको किसी भी डेटा इनबेटनी ड्रैग की जरूरत नहीं है, तो आपको बस सेट करना चाहिए:

[mySlider setContinuous: NO];

इस तरह आपको valueChangedघटना तभी मिलेगी जब उपयोगकर्ता स्लाइडर को स्थानांतरित करना बंद कर देगा ।

स्विफ्ट 5 संस्करण:

mySlider.isContinuous = false

2
यह इस सवाल का सबसे अच्छा जवाब है। काश हम इसका जवाब बदल पाते।
एम। पोरोशोनि

1
i.imgur.com/0Edd2xe.png?1 XCode संस्करण 6.x में IDE के माध्यम से स्वयं को सेट करने की यह सुविधा है।
अभिजीत

1
हां, सबसे अच्छा जवाब यह है।
सबीलैंड

1
Xcode 7.3 इंटरफ़ेस बिल्डर के पास Events [x] Continuous UpdatesUISliderView के लिए सेटिंग है। इस सेट continuousको असत्य / सं।
लीनन जू

3
बहुत बढ़िया जवाब। यहाँ स्विफ्ट 4 कोड है:self.mySlider.isContinuous = false
मार्को वेबर

115

आप 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;
    }
}

स्विफ्ट 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
        }
    }
}

इंटरफ़ेस बिल्डर में ध्यान दें एक क्रिया जोड़ते समय आपके पास कार्रवाई के लिए प्रेषक और घटना पैरामीटर दोनों को जोड़ने का विकल्प भी होता है।


1
अच्छी तरह से काम! उसके लिए आपको स्रोत कहां से मिला?
रूई मुलिया

2
धन्यवाद @RoiMulia, मुझे याद नहीं है कि मैंने पहली बार इसे कहाँ देखा था, मैं वर्षों से स्लाइडर में उपयोग कर रहा हूं। मैं कभी-कभी इसका उपयोग यूआईटचपेज़ पर बदलाव को अनदेखा करने के लिए करता हूं। क्योंकि जब उपयोगकर्ता अपनी उंगली उठाता है तो मूल्य कूद जाता है।
डेविन पिचर

2
isContinuous = trueअपने में स्थापित करने के लिए याद रखें UISlider
krlbsk

2
यह एक महान समाधान है, हालांकि इसमें टच कैंसलिंग का मुद्दा है। टचवेम एनम में "रद्द" घटना होने के बावजूद, टच रद्द होने पर इसे निकाल नहीं दिया जाता है। इसलिए मैं भी स्लाइडर से TouchCancel घटना के लिए एक श्रोता जोड़ने की सलाह देते हैं। यह सभी संभावनाओं को कवर करना चाहिए।
ब्यून्से

2
मैंने देखा कि कभी-कभी चरण जा सकता है: शुरू, स्थिर, स्थानांतरित, लेकिन फिर कभी समाप्त नहीं हुआ और न ही रद्द किया गया। यह मेरे उपयोग के मामले के लिए समस्याग्रस्त है क्योंकि मुझे उम्मीद थी कि हर बातचीत समाप्त हो जाएगी या रद्द हो जाएगी। ठीक ऊपर उल्लेख किया गया है: एक अलग स्पर्श रद्द लक्ष्य / कार्रवाई का उपयोग करें।
जॉर्डन एच

71

मैं "टच अप इनसाइड" और "टच अप आउट" नोटिफिकेशन का उपयोग करता हूं।

इंटरफ़ेस बिल्डर:

इंटरफ़ेस बिल्डर में दोनों सूचनाएं अपने प्राप्त करने की विधि से कनेक्ट करें। विधि इस तरह दिख सकती है:

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

कोड में:

यदि आप इसे प्रोग्रामेटिक रूप से वायर करना चाहते हैं, तो आपके दृश्य में कुछ इस तरह का होगा। (जहाँ भी यह आपको फिट बैठता है) कॉल करें:

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

प्राप्त करने की विधि इस तरह दिखाई देगी:

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

19

चूंकि UISliderएक उपवर्ग है UIControl, आप इसके लिए एक लक्ष्य और कार्रवाई निर्धारित कर सकते हैं UIControlEventTouchUpInside

यदि आप इसे कोड में करना चाहते हैं, तो यह इस तरह दिखता है:

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

dragEndedForSlider:स्पर्श समाप्त होने पर आपको एक संदेश भेजा जाएगा ।

यदि आप इसे अपने निब में करना चाहते हैं, तो आप इसके कनेक्शन मेनू को पाने के लिए अपने स्लाइडर को नियंत्रित कर सकते हैं, और फिर "टच इनसाइड" सॉकेट से लक्ष्य ऑब्जेक्ट पर खींचें।

तुम भी के लिए एक लक्ष्य और कार्रवाई जोड़ना चाहिए UIControlEventTouchUpOutsideऔर के लिए UIControlEventTouchCancel


1
@rob mayoff क्षमा करें, लेकिन आपको UIControlEventTouchUpOutside का उपयोग करने की आवश्यकता है। अन्यथा चयनकर्ता को नहीं बुलाया जाएगा यदि आपकी उंगली स्लाइडर पर नहीं है जब आप खींचना समाप्त करते हैं।
user3164248

2
UISliderजब से मैंने यह उत्तर लिखा है, व्यवहार बदल गया है।
15:27

पुष्टि कर सकते हैं आपको लगता है कि है की जरूरत भी आईओएस 9. में UIControlEventTouchUpOutside के लिए कोई हैंडलर रजिस्टर करने के लिए
LMS

मैंने कभी नहीं आह्वान करने में सक्षम था UIControlEventTouchCancelआईओएस 9. में हैंडलर लेकिन मैं आह्वान करने के लिए कर सकती हूं UIControlEventTouchUpInsideऔर UIControlEventTouchUpOutsideकेवल।
पेट्रसिन

17

स्विफ्ट 5 और स्विफ्ट 4

  1. touchUpInsideऔर touchUpOutsideघटनाओं के लिए लक्ष्य जोड़ें । आप इसे प्रोग्राम या स्टोरीबोर्ड से भी कर सकते हैं। यह है कि आप इसे कैसे प्रोग्राम करते हैं

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
  2. स्लाइडर ड्रैग के अंत को संभालने के लिए अपना फ़ंक्शन लिखें

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

हैलो। जब मैं खींचना शुरू करूं तो वीडियो कैसे रोक सकता हूं?
केमडो

यह इस बात का पता नहीं लगाता है कि ड्रैग कभी जरूरी हुआ है या नहीं, और बिना खींचे बस टैप करके ट्रिगर किया जा सकता है।
चोकी द कॉर्की

9

आप उपयोग कर सकते हैं:

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

UISlider में टचडाउन और टचअप घटनाओं के होने का पता लगाने के लिए



5

स्विफ्ट 3 जवाब

मुझे भी यही समस्या थी और अंततः यह काम करने के लिए मिला, इसलिए शायद यह किसी की मदद करेगा। स्टोरीबोर्ड में अपने_Slider को 'वैल्यू चेंज' करने के लिए कनेक्ट करें और जब स्लाइडर "स्लाइडर टच किया गया" एक्शन हो जाए और जब "स्लाइडर रिलीज़" हो जाए।

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

2
अच्छा समाधान, लेकिन सावधान रहना क्योंकि स्लाइडर का विमोचन तब होता है जब घसीटना और अंत खींचना शुरू होता है
गाय डाहर

और कभी-कभी रिलीज पर "स्लाइडर रिलीज़" नहीं कहा जाता
वादिम


4

स्विफ्ट 3.1

कभी-कभी आप स्लाइडर के ड्रैग इवेंट को लगातार फायर करना चाहेंगे, लेकिन इस आधार पर अलग कोड को निष्पादित करने का विकल्प है कि क्या स्लाइडर अभी भी घसीटा जा रहा है या अभी-अभी खींचा जा रहा है।

ऐसा करने के लिए, मैंने एंडी के उत्तर पर विस्तार किया है जो स्लाइडर की isTrackingसंपत्ति का उपयोग करता है । मुझे दो राज्यों को रिकॉर्ड करने की आवश्यकता थी: 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
  }
}

4

स्विफ्ट 4 में आप इस फ़ंक्शन का उपयोग कर सकते हैं

1 मुट्ठी कदम: - स्लाइडर में लक्ष्य जोड़ना

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

2 दूसरा चरण: - एक फंक्शन बनाएं

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

2

शायद आपको UIControlEventTouchUpInside ont UIControlEventTouchUpOutside IC UIControlEventTouchCancel घटनाओं के लिए लक्ष्य जोड़ना चाहिए।

मैं एक ही समस्या से पहले मिला, क्योंकि मैं UIControlEventTouchCancel इवेंट के लिए लक्ष्य नहीं जोड़ता ।


1

मेरा हाल ही में इसी तरह का मुद्दा था। यहाँ मैं स्विफ्ट में क्या किया है:

    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 (सत्य) प्रतीत होता है। इसे असत्य पर सेट करना वह चीज़ है जो आप चाहते हैं।


0

ऐसे में कोशिश करें

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);
}

यह हर बार स्लाइडर के अंगूठे को हिलाने पर कार्रवाई भेजता है, न कि केवल तब जब खींचें समाप्त हो गया है।
7


0

स्लाइडर के लिए एक एक्शन और आउटलेट बनाएं (या आप एक्शन से यूआईलाइडर को प्रेषक टाइप कर सकते हैं), और यूआई में कंटीन्यूअस अपडेट्स चेक बॉक्स को अनचेक करें। इस तरह हम स्लाइडर मूल्य तभी प्राप्त करेंगे जब स्लाइडर खींचना बंद कर देगा।

@IBAction func actionSlider(_ sender: Any) {
   let value = sliderSpeed.value.rounded()
}

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.