将 UISlider 捕捉到最近的数组值

Posted

技术标签:

【中文标题】将 UISlider 捕捉到最近的数组值【英文标题】:Snapping UISlider to nearest array value 【发布时间】:2016-01-05 11:15:28 【问题描述】:

我有一个在 ios 9 项目中使用 Swift 2 的问题。

我为 UISlider 创建了一个数组,它正在工作。但是,滑块不会“捕捉”到数组值,它可以位于它们之间并且是数组值之间的数字。当我对这些值进行一些计算时,它弄乱了我的数学。有什么方法可以让 sliver 值捕捉到最近的数组值?

下面是我的代码。

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,1,2,3,4,5,6..)并仅显示该索引处的元素 感谢您的反馈。我该怎么做呢? 滑块从 0 到 array.count-1 步骤 1 如果它们相互关联,考虑使用二维数组 @LeoDabus 我认为 snap 效果是他想要的关键功能。 【参考方案1】:

第一件事,来自 Apple Document

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

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

当您想让用户非常精确地控制元素的值时,您应该使用步进器而不是滑块。如需更多信息,请参阅Steppers。

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

或者

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

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

【讨论】:

感谢您的回答。我最终选择了步进器【参考方案2】:

试试这个

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于将 UISlider 捕捉到最近的数组值的主要内容,如果未能解决你的问题,请参考以下文章

uislider:打开预览图片,如杂志应用

实施步骤/捕捉 UISlider

UISlider - 缺少功能 - 捕捉、工具提示和刻度

如何防止 UISlider 在捕捉/步进时跳到位

自定义 UISlider 不会结束

将 UISlider 直接移动到一个值[重复]