我在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)"
答案 0 :(得分:0)
首先,来自Apple Document
UISlider
对象是一个可视控件,用于从连续值范围中选择单个值。
并且要实现类似的视觉安排,而不是使用UIPickerView
(如果你愿意,你仍然可以使用),根据另一个Apple Doc
当您希望为用户提供对元素值的非常精确的控制时,您应该使用步进器而不是滑块。有关详细信息,请参阅Steppers。
如果您考虑UIStepper
,则可以使用步进器值作为数组的索引,并在fpsArray
和angleArray
中为您的标签显示相应的值。
或强>
要使用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)"