将UISlider捕捉到最近的数组值

时间:2016-01-05 11:15:28

标签: ios swift uislider

我在iOS 9项目中使用Swift 2时遇到了一个问题。

我为UISlider创建了一个数组,它正在运行。但是,滑块不会“捕捉”到数组值,它可以位于它们之间,并且是数组值之间的数字。因为我正在对这些值进行一些计算,所以它会弄乱我的数学。有没有办法让条子值捕捉到最近的数组值?

以下是我的代码。

let fpsArray = ["23.98", "24", "25","29.97","30","50","59.94","60"]
let angleArray = ["11.25","15","22.5","30","37.5","45","60","72","75","90","108","120","144","150","172.8","180","216","270","324","360"]

    override func viewDidLoad() {
    super.viewDidLoad()


    // Do any additional setup after loading the view, typically from a nib.
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



@IBAction func fpsLabelChange(sender: UISlider) {


    let currentValue = fpsArray[Int(sender.value)]
    fpsLabel.text = "\(currentValue)"

}

@IBAction func angleLabelChange(sender: UISlider) {


    let anglecurrentValue = angleArray[Int(sender.value)]
    angleLabel.text = "\(anglecurrentValue)"

}

@IBAction func changeSpeedLabel(sender: AnyObject) {

    //maths
    let framespersecond = fpsSlider.value
    let shutterangle = angleSlider.value
    let shutterspeed = (framespersecond * 360) / (shutterangle)
    speedLabel.text = "1/\(shutterspeed)"

3 个答案:

答案 0 :(得分:0)

首先,来自A​​pple Document

  

UISlider对象是一个可视控件,用于从连续值范围中选择单个值。

并且要实现类似的视觉安排,而不是使用UIPickerView(如果你愿意,你仍然可以使用),根据另一个Apple Doc

  

当您希望为用户提供对元素值的非常精确的控制时,您应该使用步进器而不是滑块。有关详细信息,请参阅Steppers

如果您考虑UIStepper,则可以使用步进器值作为数组的索引,并在fpsArrayangleArray中为您的标签显示相应的值。

要使用UISlider,您仍需要执行一些可怕的数学运算来确定它接近的值。由于您的数组不是算术序列,因此很难设计出反映不同数字差异的好方法。

通过持续跟踪UISlider的值,您可以在找到最接近的值后同时设置滑块和文本的值。

答案 1 :(得分:0)

试试这个

let currentValue = fpsArray[Int(floor(sender.value+0.5))]

答案 2 :(得分:0)

感谢所有帮助。我最终将文本标签变成了一个int,它从数组中调用并使用步进器来遍历数组。

    let a:Int? = Int(fpsLabel.text!)
    let b:Int? = Int(angleLabel.text!)
    let shutterspeed = (a! * 360) / b!
    speedLabel.text = "1/\(shutterspeed)"