যখন ব্যবহারকারী কোনও স্লাইডার পয়েন্টারের টানুন শেষ করে কীভাবে ইভেন্টটি সনাক্ত করবেন?
যখন ব্যবহারকারী কোনও স্লাইডার পয়েন্টারের টানুন শেষ করে কীভাবে ইভেন্টটি সনাক্ত করবেন?
উত্তর:
আপনার যদি সহজভাবে সেট করা উচিত তার চেয়ে আপনার অভ্যন্তরীণ টানাগুলির অভ্যন্তরে কোনও ডেটা প্রয়োজন হয় না:
[mySlider setContinuous: NO];
এইভাবে আপনি valueChanged
ইভেন্টটি কেবল তখনই পাবেন যখন ব্যবহারকারী স্লাইডারটি সরানো বন্ধ করে দেয়।
সুইফ্ট 5 সংস্করণ:
mySlider.isContinuous = false
self.mySlider.isContinuous = false
আপনি ইউআইসিন্ট্রোলএভেন্টভ্যালুচেনজডের জন্য দুটি পরামিতি, প্রেরক এবং একটি ইভেন্ট লাগে এমন একটি ক্রিয়া যুক্ত করতে পারেন :
[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
ইউআইস্লাইডারে কখন টাচডাউন এবং টাচআপ ইভেন্টগুলি ঘটে তা সনাক্ত করতে
আমি মনে করি আপনার নিয়ন্ত্রণ ইভেন্টটি দরকার UIControlEventTouchUpInside
।
3 উত্তর উত্তর
আমার একই সমস্যা ছিল এবং শেষ পর্যন্ত এটি কাজ করতে পেলাম, তাই এটি কারওর পক্ষে সহায়তা করবে। আপনার স্লাইডারটিকে স্টোরিবোর্ডে 'মান পরিবর্তিত' এর সাথে সংযুক্ত করুন এবং যখন স্লাইডারটি "স্লাইডার স্পর্শ" ক্রিয়াকলাপে চলে আসে এবং যখন "স্লাইডার প্রকাশিত হয়" let
@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
ডিফল্টটি হ্যাঁ (সত্য) বলে মনে হচ্ছে। এটিকে মিথ্যা হিসাবে সেট করা আপনার পছন্দ মতো কাজ করে।
এই মত চেষ্টা করুন
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);
}
আরএক্সসুইফ্ট:
self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
.bind(to: self.viewModel.endSlidingSlider)
.disposed(by: self.disposeBag)
স্লাইডারটির জন্য একটি ক্রিয়া এবং আউটলেট তৈরি করুন (বা আপনি প্রেরণকারীকে ক্রিয়া থেকে ইউআইএস্লাইডারে টাইপকাস্ট করতে পারেন) এবং ইউআইতে অবিচ্ছিন্ন আপডেটগুলি চেক বাক্সে আনচেক করুন। এইভাবে আমরা স্লাইডার মানটি তখনই পাব যখন স্লাইডারটি টানাটানি বন্ধ করে দেয়।
@IBAction func actionSlider(_ sender: Any) {
let value = sliderSpeed.value.rounded()
}