আইফোন: কীভাবে স্লাইডার টানতে হবে?


96

যখন ব্যবহারকারী কোনও স্লাইডার পয়েন্টারের টানুন শেষ করে কীভাবে ইভেন্টটি সনাক্ত করবেন?


4
ব্যবহার করুন: [স্লাইডার অ্যাডট্যাজেট: স্ব-ক্রিয়া: @ নির্বাচনকারী (স্লাইডারসটপড্র্যাগিং :) জন্য নিয়ন্ত্রণকারীসমূহ: ইউআইসিএন্ট্রোলএভেন্টটিউচআপআইসাইড | ইউআইসিএন্ট্রোলইভেন্টটিউচআপসাইড];
হেনরি সউ

উত্তর:


180

আপনার যদি সহজভাবে সেট করা উচিত তার চেয়ে আপনার অভ্যন্তরীণ টানাগুলির অভ্যন্তরে কোনও ডেটা প্রয়োজন হয় না:

[mySlider setContinuous: NO];

এইভাবে আপনি valueChangedইভেন্টটি কেবল তখনই পাবেন যখন ব্যবহারকারী স্লাইডারটি সরানো বন্ধ করে দেয়।

সুইফ্ট 5 সংস্করণ:

mySlider.isContinuous = false

4
এটি এই প্রশ্নের সেরা উত্তর। আমি আশা করি আমরা এর উত্তরটি পরিবর্তন করতে পারতাম।
এম পোরোশানী

4
i.imgur.com/0Edd2xe.png?1 এক্সকোড সংস্করণ 6.x এর IDE এর মাধ্যমে সেটকন্টিন্যুস সেট করার বৈশিষ্ট্য রয়েছে।
অভিজিৎ

4
হ্যাঁ, সেরা উত্তর এটি।
সাবিল্যান্ড

4
দুর্দান্ত উত্তর এখানে সুইফট 4 কোডটি রয়েছে:self.mySlider.isContinuous = false
মার্কো ওয়েবার

4
এটি লেখক যা জিজ্ঞাসা করছেন তা নয়। তিনি ক্রমাগত স্লাইড চান, এবং কখন থামবেন তাও জানতে চান।
lbsweek

120

আপনি ইউআইসিন্ট্রোলএভেন্টভ্যালুচেনজডের জন্য দুটি পরামিতি, প্রেরক এবং একটি ইভেন্ট লাগে এমন একটি ক্রিয়া যুক্ত করতে পারেন :

[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
        }
    }
}

ইন্টারফেস বিল্ডারে নোট করুন কোনও ক্রিয়া যুক্ত করার সময় আপনার কাছে ক্রিয়ায় প্রেরক এবং ইভেন্ট পরামিতি উভয়ই যুক্ত করার বিকল্প রয়েছে।


4
পুরোপুরি কাজ করে! আপনি কোথা থেকে এর উত্স পেলেন?
রুই মুলিয়া

4
ধন্যবাদ @ রইয়ুলিয়া, আমার মনে নেই আমি কোথায় এটি প্রথম দেখেছি, আমি কয়েক বছর ধরে স্লাইডারে ব্যবহার করে আসছি। আমি কখনও কখনও এটি ইউআইটিউচফেজ এন্ডের পরিবর্তনের বিষয়টি উপেক্ষা করতে ব্যবহার করি যেহেতু যখন ব্যবহারকারী আঙুল তুলে রাখেন তখন মানটি ঝাঁপিয়ে পড়ে।
ডেভিন পিচার

4
isContinuous = trueআপনার সেট করতে মনে রাখবেন UISlider
krlbsk

4
এটি একটি দুর্দান্ত সমাধান, তবে এটির সাথে স্পর্শ বাতিল করার সমস্যা রয়েছে। টাচএভেন্ট এনামে একটি "বাতিল" ইভেন্ট থাকা সত্ত্বেও, টাচ বাতিল হয়ে গেলে তা বরখাস্ত করা হয় না। তাই আমি স্লাইডার থেকে টাচক্যান্সেল ইভেন্টের জন্য শ্রোতা যুক্ত করার পরামর্শ দিচ্ছি। এটি সমস্ত সম্ভাবনা কভার করা উচিত।
বনেসে

4
আমি দেখেছি যে কখনও কখনও এই পর্ব যেতে পারে: শুরু, স্থির, সরানো, কিন্তু তারপর কখনও শেষ বা বাতিল হয়নি canceled এটি আমার ব্যবহারের ক্ষেত্রে সমস্যাযুক্ত কারণ আমি প্রত্যাশা করেছি যে প্রতিটি মিথস্ক্রিয়া শেষ হবে বা বাতিল হবে। ফিক্স উপরে উল্লিখিত হয়: একটি পৃথক স্পর্শ বাতিল লক্ষ্য / ক্রিয়া ব্যবহার করুন।
জর্ডান এইচ

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


4
@rob mayoff দুঃখিত তবে আপনাকে ইউআইসিএন্ট্রোলএভেন্টটিউচআপের বাইরে ব্যবহার করতে হবে। অন্যথায় নির্বাচিতকে ডাকা হবে না যদি আপনি টানাটানি শেষ করার পরে আপনার আঙুলটি স্লাইডারে না থাকে।
ব্যবহারকারী 3164248

4
UISliderআমি এই উত্তরটি লেখার পর থেকে আচরণের পরিবর্তন হয়েছে।
রব মায়ফ

আপনাকে আইওএস 9-তে ইউআইসিএন্ট্রোলটেন্টটচআপের জন্য একটি হ্যান্ডলারও নিবন্ধিত করতে হবে তা নিশ্চিত করতে পারেন
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  

ইউআইস্লাইডারে কখন টাচডাউন এবং টাচআপ ইভেন্টগুলি ঘটে তা সনাক্ত করতে



5

3 উত্তর উত্তর

আমার একই সমস্যা ছিল এবং শেষ পর্যন্ত এটি কাজ করতে পেলাম, তাই এটি কারওর পক্ষে সহায়তা করবে। আপনার স্লাইডারটিকে স্টোরিবোর্ডে 'মান পরিবর্তিত' এর সাথে সংযুক্ত করুন এবং যখন স্লাইডারটি "স্লাইডার স্পর্শ" ক্রিয়াকলাপে চলে আসে এবং যখন "স্লাইডার প্রকাশিত হয়" let

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

4
গুড সমাধান, কিন্তু সতর্কতা অবলম্বন কারণ স্লাইডার মুক্তিপ্রাপ্ত বলা হয় যখন টেনে শুরু এবং শেষ টেনে
গায় Daher

এবং কখনও কখনও মুক্তির জন্য "স্লাইডার প্রকাশিত" নামে পরিচিত না
ভাদিম


4

সুইফট ৩.১

কখনও কখনও আপনি স্লাইডারের ড্র্যাগ ইভেন্টগুলি অবিচ্ছিন্নভাবে জ্বলতে চান, তবে স্লাইডারটি এখনও টানা হচ্ছে কিনা বা স্রেফ টেনে নিয়ে যাওয়া শেষ হয়েছে কিনা তার উপর নির্ভর করে বিভিন্ন কোড কার্যকর করার বিকল্প রয়েছে।

এটি করার জন্য, আমি উপরে অ্যান্ডির উত্তরে প্রসারিত করেছি যা স্লাইডারের 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

হতে পারে আপনার ইউআইসিএন্ট্রোলএভেন্টটিউচউইপআইএনসাইড ont ইউআইসিএন্ট্রোলএভেন্টটিউচআউপিওসাইড 、 ইউআইসিএন্ট্রোলএভেন্টটিচচ্যান্সেল ইভেন্টের জন্য লক্ষ্য যুক্ত করা উচিত।

আমি এর আগেও একই সমস্যার মুখোমুখি হয়েছিলাম, কারণ আমি ইউআইসিএন্ট্রোলএভেন্টটিচচ্যান্সেল ইভেন্টের জন্য লক্ষ্য যুক্ত করি না ।


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

ডিফল্টটি হ্যাঁ (সত্য) বলে মনে হচ্ছে। এটিকে মিথ্যা হিসাবে সেট করা আপনার পছন্দ মতো কাজ করে।


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

এটি প্রতিবার স্লাইডারের থাম্বটি সরানোর সময় অ্যাকশন প্রেরণ করে, কেবল তখনই টানা শেষ হয়নি।
রব মায়ফ

0

আরএক্সসুইফ্ট:

self.slider.rx.controlEvent([.touchUpInside, .touchUpOutside])
    .bind(to: self.viewModel.endSlidingSlider)
    .disposed(by: self.disposeBag)

0

স্লাইডারটির জন্য একটি ক্রিয়া এবং আউটলেট তৈরি করুন (বা আপনি প্রেরণকারীকে ক্রিয়া থেকে ইউআইএস্লাইডারে টাইপকাস্ট করতে পারেন) এবং ইউআইতে অবিচ্ছিন্ন আপডেটগুলি চেক বাক্সে আনচেক করুন। এইভাবে আমরা স্লাইডার মানটি তখনই পাব যখন স্লাইডারটি টানাটানি বন্ধ করে দেয়।

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

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.