ios - 如何使用 SwiftUI 创建带有刻度线的滑块?
问题描述
使用 SwiftUI,我想创建一个最小/最大范围为 5-20 的滑块,用户可以在其中滑动并向上滑动 5。开箱即用的滑块看起来非常“平坦”/平滑。有没有办法可以添加所述刻度线,以使滑块看起来像“捕捉”到刻度线?
如果滑块被认为不是实现该效果的正确方法,我愿意接受其他选择。
解决方案
Slider 有一堆初始化选项,其中一些包括一个“步骤”参数,它创建了捕捉效果。它的边缘没有可见的刻度线,但您可以在旁边手动创建它。
import SwiftUI
struct SliderView: View {
@State var value: CGFloat = 10
let min: CGFloat = 5
let max: CGFloat = 20
let step: CGFloat = 5
var body: some View {
VStack {
Text(formated(value: value))
Slider(
value: $value,
in: min...max,
step: step,
minimumValueLabel: Text(formated(value: min)),
maximumValueLabel: Text(formated(value: max)),
label: { })
VStack(spacing: 0) {
Slider(
value: $value,
in: min...max,
step: step)
.accentColor(.red)
HStack(spacing: 0) {
let count: Int = Int((max / step))
ForEach(0..<count) { index in
VStack {
Text("I")
Text("\(index * Int(step) + Int(min))")
}
.offset(x:
index == 1 ? 5 :
index == 2 ? 4 :
0
)
if index != (count - 1) {
Spacer()
}
}
}
.padding(.horizontal, 8)
}
.padding()
}
.padding()
}
func formated(value: CGFloat) -> String {
return String(format: "%.0f", value)
}
}
推荐阅读
- java - 区别 boolean[] b = {false} 与 boolean b = false?
- python - 如何在html中抓取非文本?
- drools - 流口水不认识!使用自定义运算符
- android - 连接恢复时向服务器重新发送数据
- android - Android MediaPlayer,如何播放没有音频的视频并且不中断其他音频流
- javascript - 为什么我可以调用 verfieFormulaire.js 而不能调用 captureMouvement.js?
- php - laravel模型中具有随机值的默认属性
- python - 独立组件分析以将对象与框架分离
- webpack - 你如何在 koa app 中组织你的目录结构?
- php - 尝试更新组时出现错误“目标实体集当前不支持该请求”