Search code examples
iosslideruisliderswift2

Set two UISliders to never go below each other in swift


I wanted a two thumb slider but couldn't figure out how to do it after endless efforts! So I have settled on using two sliders as cheeky UI and it works. However now I need to set it so that both sliders have a distance of 4 between them ie. when both sliders are beside each other they can't go nearer than 4 values. so when min is at 10, max can only go as low as 14. How do I do this? I tried the code below from a different SO question but it doesn't work.

I tried the code below but it sets them both to zero and they are odd and buggy ie. when one is moved it sets the other to zero or the max won't go to 55 but 24.

    var slider1:Float = 0.0
    var slider2:Float = 0.0

func configureDefaultMaxAgeSlider() {
    maxAgeSlider.minimumValue = 10
    maxAgeSlider.maximumValue = (55 - slider1)
   // maxAgeSlider.value = 0
    maxAgeSlider.continuous = true
}
func configureDefaultAgeSlider() {
    ageSlider.minimumValue = 10
    ageSlider.maximumValue = (55 - slider2)
    // ageSlider.value = 0
    ageSlider.continuous = true
}

@IBOutlet weak var maxAgeLabel: UILabel!

@IBOutlet weak var ageSlider: UISlider!
@IBOutlet weak var maxAgeSlider: UISlider!

@IBAction func ageSliderValueChanged(sender: UISlider) {

    let minAgeValue = Int(sender.value)

    ageLabel.text = "\(minAgeValue)"

    minAgeSearch = "\(minAgeValue)"

    slider1 = (sender.value)
    configureDefaultMaxAgeSlider()

}

@IBAction func maxAgeSliderValueChanged(sender: UISlider) {

    let maxAgeValue = Int(sender.value)

    maxAgeLabel.text = "\(maxAgeValue)"

    maxAgeSearch = "\(maxAgeValue)"

    slider1 = (sender.value)

    configureDefaultAgeSlider()

}

I found it in objc but I don't know how to convert it. SO objc answer

Edit

I nearly have the concept of it working has anyone any idea what I am doing wrong???

@IBAction func ageSliderValueChanged(sender: UISlider) {

    let minAgeValue = Int(sender.value)

    ageLabel.text = "\(minAgeValue)"

    minAgeSearch = "\(minAgeValue)"

    if ageSlider.value > maxAgeSlider.value {
    maxAgeSlider.value = ageSlider.value

    }


    minAgeUserDefaults.setObject(minAgeSearch, forKey: "name")
}

@IBAction func maxAgeSliderValueChanged(sender: UISlider) {
    let maxAgeValue = Int(sender.value)

    maxAgeLabel.text = "\(maxAgeValue)"

    maxAgeSearch = "\(maxAgeValue)"


    if maxAgeSlider.value < ageSlider.value {
        maxAgeSlider.value = ageSlider.value

    }

    maxAgeUserDefaults.setObject(maxAgeSearch, forKey: "age")
}


    ageSlider.continuous = true
   maxAgeSlider.continuous = true

Solution

  • I solved it so that if max age slider goes below min age slider it will reverse the results behind the scenes. It functions, however it is definitely not the best UI wise as it displays the max and min ages as for example if min is set to 35 max age is set to 28 it will display it as such but it will return the results correctly when requested which is the main thing I needed. Here is the code I used:

    if maxAge < minAge {
            maxAge = minAgeSearch
            minAge = maxAgeSearch
        }