如何将 iOS 滑块值限制为整数?

Posted

技术标签:

【中文标题】如何将 iOS 滑块值限制为整数?【英文标题】:How can I restrict iOS slider value to an integer? 【发布时间】:2017-01-05 12:42:25 【问题描述】:

我有一个水平的UISlider 来控制音量从 1 到 16 作为最小值和最大值,但是当我执行 print() 时它会返回浮点值。

如何将 UISlider 值限制为整数?

@IBOutlet var ringValue: UISlider!

@IBAction func ringVolumeSliderChange(_ sender: UISlider)

    print(sender.value)

【问题讨论】:

能否请您添加不接受答案的原因,以便我改进我的答案。 【参考方案1】:

UISlidervalue 属性属于Float 类型,因此您无法更改它,但可以使用Int(sender.value) 将其转换为Int

@IBAction func ringVolumeSliderChange(_ sender: UISlider) 
    print(Int(sender.value))

【讨论】:

您还可以将滑块的值设置为 int 转换后的值,这样您的滑块就不会随意更改。但它有点符合您选择的价值。在 IBAction let iSliderValue = Int(sender.value) sender.value = Float(iSliderValue) 中看起来像这样【参考方案2】:

如果您希望您的 Slider 仅在步骤中定位,请执行以下操作:

@IBAction func ringVolumeSliderChange(_ sender: UISlider)

    sender.setValue(sender.value.rounded(.down), animated: true)
    print(sender.value)

在此示例中,我假设您已设置最小值和最大值。现在,随着用户四处滑动,滑块会从一个位置跳到另一个位置。

【讨论】:

【参考方案3】:
@IBAction func SliderValueChanged(_ sender: UISlider) 
    showValueSlider.text = String(format: "The value is:%i",Int(sender.value))

【讨论】:

虽然此代码可以回答问题,但提供有关其解决问题的方式和原因的信息可提高其长期价值。【参考方案4】:

为了使滑块更平滑并一次获取一个结果(当用户停止滑动时),您可以在viewDidLoad 中使用此行:

ringValue.isContinuous = false

然后,您可以选择如何处理其他答案之一的结果。我喜欢 jboi 的答案,所以它会采用离散值。

【讨论】:

【参考方案5】:

我有一个水平 UISlider 来控制从 1 到 16 的最小音量 和最大值...

默认value属性的最小值为0.0,最大值为1.0。

如果你想根据滑块值获得一个从 1 到 16 的整数,你应该做 @NiravD suggested 和额外的 -pretty simple- maths :)

@IBAction func ringVolumeSliderChange(_ sender: UISlider) 
    print(Int((sender.value * 15).rounded()) + 1)

将其设为print(Int(sender.value)),如果滑块达到最大值 (1.0),则打印 1,所有其他值小于 1.0 时将打印为 0。

【讨论】:

请注意 Int by Double 初始化程序会截断数字的小数部分(如果它没有溢出,这里不会溢出),例如对于sender.value * 15 等于1.7,初始化程序将截断为1(但这可能应该是2)。您可以考虑在Int 初始化之前对计算出的Double 值进行四舍五入(例如Int((sender.value * 15).rounded()) + 1 甚至lroundf(sender.value * 15) + 1 :) @dfri 感谢您的注意,我根据您提到的内容编辑了我的答案【参考方案6】:
var slideValue: String = "0"

@objc private func didSliderValueChanged(_ sender: UISlider) 
    let formattedValue = String(format: "%.0f", sender.value)
    
    if let floatValue = Float(formattedValue) 
        sender.value = floatValue
    
        
    guard formattedValue != slideValue else 
        return
    

    //This part is optional, and can make slider more interactive
    UIImpactFeedbackGenerator(style: .medium).impactOccurred()

    slideValue = formattedValue

【讨论】:

欢迎来到 SO。此代码可能会解决问题,但如果您添加关于它如何解决问题的说明,您的回答将对其他用户有更大的帮助。【参考方案7】:

SwiftUI

@State private var diameter: Double = 10
var body: some View 
     HStack 
       Slider(value: $diameter, in: 0...100)
       Text("\(Int(diameter))")
      

【讨论】:

@State private 在体内?你确定这段代码有效吗? 你能像 jboi 的回答那样让滑块跳到离散值吗? @Caleb SwiftUI 有一个 Slider 初始化器 --> Slider(value: , in: , step: , onEditingChanged: minimumValueLabel: , maximumValueLabel: , label: ) @tiktoker Cristik 的评论出现在您编辑移动 diameter 之前。

以上是关于如何将 iOS 滑块值限制为整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用按钮将4个滑块值一起添加?

如何通过Appium / WebdriverIO更改iOS滑块值

如何在标签中放置滑块值?

如何在自定义 UISlider 中在滑块值 0 之前和滑块值 100 之后提供填充

iOS,在滑块值 n 处触发一次 UIViewAnimation?

如何以编程方式创建默认滑块值?