Implementing steps/snapping UISlider

后端 未结 6 1077
悲哀的现实
悲哀的现实 2020-12-23 02:07

I am trying to implement some form of snapping or steps with the UISlider. I have written the following code but it does not work as smooth as I hoped for. It works, but whe

相关标签:
6条回答
  • 2020-12-23 02:25

    It's actually considerably easier than I first thought. Originally I was trying to get the thumbrect property and do complicated math. Here's what I ended up with:

    h File:

    @property (nonatomic, retain) IBOutlet UISlider* questionSlider;
    @property (nonatomic) float lastQuestionStep;
    @property (nonatomic) float stepValue;
    

    m File:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // Set the step to whatever you want. Make sure the step value makes sense
        //   when compared to the min/max values for the slider. You could take this
        //   example a step further and instead use a variable for the number of
        //   steps you wanted.
        self.stepValue = 25.0f;
    
        // Set the initial value to prevent any weird inconsistencies.
        self.lastQuestionStep = (self.questionSlider.value) / self.stepValue;
    }
    
    // This is the "valueChanged" method for the UISlider. Hook this up in
    //   Interface Builder.
    -(IBAction)valueChanged:(id)sender {
        // This determines which "step" the slider should be on. Here we're taking 
        //   the current position of the slider and dividing by the `self.stepValue`
        //   to determine approximately which step we are on. Then we round to get to
        //   find which step we are closest to.
        float newStep = roundf((questionSlider.value) / self.stepValue);
    
        // Convert "steps" back to the context of the sliders values.
        self.questionSlider.value = newStep * self.stepValue;
    }
    

    Make sure you hook up the method and the outlet for your UISlider view and you should be good to go.

    0 讨论(0)
  • 2020-12-23 02:34

    A really simple one:

    - (void)sliderUpdated:(UISlider*)sli {
        CGFloat steps = 5;
        sli.value = roundf(sli.value/sli.maximumValue*steps)*sli.maximumValue/steps;    
    }
    

    Great if you want a fast solution and you've added the target by UIControlEventValueChanged.

    0 讨论(0)
  • 2020-12-23 02:36

    SWIFT VERSION

    Example: You want a slider to go from 1-10000 in steps of 100. UISlider setup is as follows:

    slider.maximumValue = 100
    slider.minimumValue = 0
    slider.continuous = true
    

    In the action func() for the slider use:

    var sliderValue:Int = Int(sender.value) * 100
    
    0 讨论(0)
  • 2020-12-23 02:37

    Another Swift approach is to do something like

    let step: Float = 10
    @IBAction func sliderValueChanged(sender: UISlider) {
      let roundedValue = round(sender.value / step) * step
      sender.value = roundedValue
      // Do something else with the value
    
    }
    
    0 讨论(0)
  • 2020-12-23 02:42

    The simplest solution to me was just

    - (IBAction)sliderValueChanged:(id)sender {
        UISlider *slider = sender;
        slider.value = roundf(slider.value);
    }
    
    0 讨论(0)
  • 2020-12-23 02:43

    Maybe someone will need! In my situation I needed any integer step, so I used the following code:

    -(void)valueChanged:(id)sender {
        UISlider *slider = sender;
        slider.value = (int)slider.value;
    }
    
    0 讨论(0)
提交回复
热议问题