【发布时间】:2021-03-03 12:13:51
【问题描述】:
我正在考虑创建一个自定义滑块,它具有渐变背景、表示值的数字以及线条上的白点以显示每一步的位置,我正在寻找的内容如下所示:
我查看了其他几个教程,但我所做的都没有给我我之后的结果,要么是因为元素没有对齐,要么我的代码不像默认滑块那样工作。
一个额外的技巧是我还希望像默认滑块一样快速定位,所以用户不能选择 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 还是新手,只使用了一个月。
感谢您的建议。
【问题讨论】: