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

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

如何将 UISlider 值限制为整数?

@IBOutlet var ringValue: UISlider!

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

【问题讨论】:

  • 能否请您添加不接受答案的原因,以便我改进我的答案。

标签: ios swift uislider


【解决方案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 之前。
      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多