जब उपयोगकर्ता ने स्लाइडर पॉइंटर के ड्रैग को समाप्त कर दिया है तो घटना का पता कैसे लगाएं?
जब उपयोगकर्ता ने स्लाइडर पॉइंटर के ड्रैग को समाप्त कर दिया है तो घटना का पता कैसे लगाएं?
जवाबों:
यदि आपको किसी भी डेटा इनबेटनी ड्रैग की जरूरत नहीं है, तो आपको बस सेट करना चाहिए:
[mySlider setContinuous: NO];
इस तरह आपको valueChanged
घटना तभी मिलेगी जब उपयोगकर्ता स्लाइडर को स्थानांतरित करना बंद कर देगा ।
स्विफ्ट 5 संस्करण:
mySlider.isContinuous = false
Events [x] Continuous Updates
UISliderView के लिए सेटिंग है। इस सेट continuous
को असत्य / सं।
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;
}
}
स्विफ्ट 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
}
}
}
इंटरफ़ेस बिल्डर में ध्यान दें एक क्रिया जोड़ते समय आपके पास कार्रवाई के लिए प्रेषक और घटना पैरामीटर दोनों को जोड़ने का विकल्प भी होता है।
isContinuous = true
अपने में स्थापित करने के लिए याद रखें UISlider
।
मैं "टच अप इनसाइड" और "टच अप आउट" नोटिफिकेशन का उपयोग करता हूं।
इंटरफ़ेस बिल्डर:
इंटरफ़ेस बिल्डर में दोनों सूचनाएं अपने प्राप्त करने की विधि से कनेक्ट करें। विधि इस तरह दिख सकती है:
- (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");
}
चूंकि UISlider
एक उपवर्ग है UIControl
, आप इसके लिए एक लक्ष्य और कार्रवाई निर्धारित कर सकते हैं UIControlEventTouchUpInside
।
यदि आप इसे कोड में करना चाहते हैं, तो यह इस तरह दिखता है:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
dragEndedForSlider:
स्पर्श समाप्त होने पर आपको एक संदेश भेजा जाएगा ।
यदि आप इसे अपने निब में करना चाहते हैं, तो आप इसके कनेक्शन मेनू को पाने के लिए अपने स्लाइडर को नियंत्रित कर सकते हैं, और फिर "टच इनसाइड" सॉकेट से लक्ष्य ऑब्जेक्ट पर खींचें।
तुम भी के लिए एक लक्ष्य और कार्रवाई जोड़ना चाहिए UIControlEventTouchUpOutside
और के लिए UIControlEventTouchCancel
।
UISlider
जब से मैंने यह उत्तर लिखा है, व्यवहार बदल गया है।
UIControlEventTouchCancel
आईओएस 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 में टचडाउन और टचअप घटनाओं के होने का पता लगाने के लिए
मुझे लगता है कि आपको नियंत्रण घटना की आवश्यकता है UIControlEventTouchUpInside
।
स्विफ्ट 3 जवाब
मुझे भी यही समस्या थी और अंततः यह काम करने के लिए मिला, इसलिए शायद यह किसी की मदद करेगा। स्टोरीबोर्ड में अपने_Slider को 'वैल्यू चेंज' करने के लिए कनेक्ट करें और जब स्लाइडर "स्लाइडर टच किया गया" एक्शन हो जाए और जब "स्लाइडर रिलीज़" हो जाए।
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
कभी-कभी आप स्लाइडर के ड्रैग इवेंट को लगातार फायर करना चाहेंगे, लेकिन इस आधार पर अलग कोड को निष्पादित करने का विकल्प है कि क्या स्लाइडर अभी भी घसीटा जा रहा है या अभी-अभी खींचा जा रहा है।
ऐसा करने के लिए, मैंने एंडी के उत्तर पर विस्तार किया है जो स्लाइडर की 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 में आप इस फ़ंक्शन का उपयोग कर सकते हैं
1 मुट्ठी कदम: - स्लाइडर में लक्ष्य जोड़ना
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 दूसरा चरण: - एक फंक्शन बनाएं
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->\(distanceSlider.value)")
}
मेरा हाल ही में इसी तरह का मुद्दा था। यहाँ मैं स्विफ्ट में क्या किया है:
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 (सत्य) प्रतीत होता है। इसे असत्य पर सेट करना वह चीज़ है जो आप चाहते हैं।
ऐसे में कोशिश करें
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);
}
स्लाइडर के लिए एक एक्शन और आउटलेट बनाएं (या आप एक्शन से यूआईलाइडर को प्रेषक टाइप कर सकते हैं), और यूआई में कंटीन्यूअस अपडेट्स चेक बॉक्स को अनचेक करें। इस तरह हम स्लाइडर मूल्य तभी प्राप्त करेंगे जब स्लाइडर खींचना बंद कर देगा।
@IBAction func actionSlider(_ sender: Any) {
let value = sliderSpeed.value.rounded()
}