我想要创建一个自定义滑块,带有渐变背景、代表值的数字和在线上显示每个步骤位置的白色点。我想要的效果如下图所示:
我看了几个其他的教程,但是我所做的都没有达到我想要的结果,要么元素不对齐,要么我的代码不如默认滑块好用。
另一个棘手的问题是,我还想像默认滑块一样具有捕捉位置的功能,这样用户就不能选择6.5522这样的值,只能选择6或7。
以下是我目前的代码:
在视图代码中的实现方式:
另一个棘手的问题是,我还想像默认滑块一样具有捕捉位置的功能,这样用户就不能选择6.5522这样的值,只能选择6或7。
以下是我目前的代码:
import SwiftUI
struct CustomSlider: View {
let textColor: Color
let thumbColor: Color
let height: CGFloat
let cornerRadius: CGFloat
@State var lastOffset: CGFloat = 0
@Binding var value: CGFloat
var range: ClosedRange<CGFloat>
var leadingOffset: CGFloat = 5
var trailingOffset: CGFloat = 5
var body: some View {
GeometryReader { geo in
VStack {
ZStack {
RoundedRectangle(cornerRadius: cornerRadius).fill(LinearGradient(gradient: Gradient(colors: [.paleRed, .mango, .neonYellow, .midGreen]), startPoint: .leading, endPoint: .trailing))
.frame(height: height)
HStack {
ForEach(1..<11) { index in
Circle()
.foregroundColor(.white)
.frame(width: height, height: height)
if index < 10 {
Spacer()
}
}
}
HStack {
Circle()
.frame(width: height * 2, height: height * 2)
.foregroundColor(thumbColor)
.offset(x: CGFloat(self.$value.wrappedValue.map(from: self.range, to: 6...(geo.size.width - 6 - 22))))
.gesture(
DragGesture(minimumDistance: 0)
.onChanged { value in
if abs(value.translation.width) < 0.1 {
self.lastOffset = self.$value.wrappedValue.map(from: self.range, to: self.leadingOffset...(geo.size.width - (height * 2) - self.trailingOffset))
}
let sliderPos = max(0 + self.leadingOffset, min(self.lastOffset + value.translation.width, geo.size.width - (height * 2) - self.trailingOffset))
let sliderVal = sliderPos.map(from: self.leadingOffset...(geo.size.width - (height * 2) - self.trailingOffset), to: self.range)
self.value = sliderVal
}
)
Spacer()
}
}
HStack {
ForEach(1..<11) { index in
Text("\(index)")
.foregroundColor(.secondaryButtonLightGrey)
.font(.custom("Rubik-Medium", size: 16))
if index < 10 {
Spacer()
}
}
}
}
}
}
}
在视图代码中的实现方式:
CustomSlider(textColor: .textColor, thumbColor: .thumbColor, height: 10, cornerRadius: 10, value: $value, range: 0...10)
如果这些问题太简单了,我向您道歉,因为我对SwiftUI还很陌生,只使用了一个月。
感谢您提供任何建议。