如何将 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】:UISlider
的value
属性属于Float
类型,因此您无法更改它,但可以使用Int(sender.value)
将其转换为Int
。
@IBAction func ringVolumeSliderChange(_ sender: UISlider)
print(Int(sender.value))
【讨论】:
您还可以将滑块的值设置为 int 转换后的值,这样您的滑块就不会随意更改。但它有点符合您选择的价值。在 IBActionlet 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 滑块值限制为整数?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过Appium / WebdriverIO更改iOS滑块值
如何在自定义 UISlider 中在滑块值 0 之前和滑块值 100 之后提供填充