Swift 快捷界面:滑块不';不要停留在他们的立场上
我的应用程序为潜水员计算一些重要值,如最大深度等,单位为米或英尺。计算结果写在一个单独的文件中。当我在另一个位置更改滑块值时,例如最大值上的所有值(90%和1.6bar(在右侧完成)),然后将选择器从公制更改为英制,滑块将捕捉回其起始位置(32%和1.2bar),但设置的值将保留。看图片。我能做什么 启动应用程序: 更改值: 改为帝国;滑块回扣:Swift 快捷界面:滑块不';不要停留在他们的立场上,swift,swiftui,Swift,Swiftui,我的应用程序为潜水员计算一些重要值,如最大深度等,单位为米或英尺。计算结果写在一个单独的文件中。当我在另一个位置更改滑块值时,例如最大值上的所有值(90%和1.6bar(在右侧完成)),然后将选择器从公制更改为英制,滑块将捕捉回其起始位置(32%和1.2bar),但设置的值将保留。看图片。我能做什么 启动应用程序: 更改值: 改为帝国;滑块回扣: struct ContentView: View { @State var unitSelection = UserD
struct ContentView: View {
@State var unitSelection = UserDefaults.standard.integer(forKey: "Picker")
@State var O2_2 = 32
@State var value1: Int = 32
@State var value2: Double = 1.2
@State var PO2_2 = 1.2
var body: some View {
ZStack {
VStack {
Picker("", selection: $unitSelection) {
Text("Metric").tag(0)
Text("Imperial").tag(1)
}
.pickerStyle(SegmentedPickerStyle()).padding(.horizontal, 89)
.onReceive(Just(unitSelection)) {
UserDefaults.standard.set($0, forKey: "Picker")
switchMeasurement(measurement: $0)
}
Spacer()
}
BasicStructure(valueIndexO2Calculate_3: $O2_2, PO2_1: $PO2_2, value1: $value1, value2: $value2, unitSelection_1: unitSelection)
}
}
}
struct BasicStructure: View {
//Variable from Picker: Calculate -> O2
@Binding var valueIndexO2Calculate_3: Int
@Binding var PO2_1: Double
@Binding var value1: Int
@Binding var value2: Double
var unitSelection_1: Int
var body: some View {
VStack {
HStack {
Spacer()
}
Calculate(O2: $valueIndexO2Calculate_3, PO2: $PO2_1, value1: $value1, unitSelection_2: unitSelection_1)
SliderOne(value1: $value1)
SliderFour(value2: $value2)
Spacer()
}
}
}
struct Calculate: View {
@Binding var O2: Int
@Binding var PO2: Double
@Binding var value1: Int
var unitSelection_2: Int
var body: some View {
VStack {
//O2 max. depth
HStack (alignment: .center){
VStack(alignment: .leading) {
Text("O2 max. depth")
Text("MOD O2")
}
Spacer()
Text(calculateMod02(o2: self.value1, po2: Float(self.PO2), measurement: unitSelection_2))
.padding(.trailing)
}
.padding(.top).padding(.horizontal)
Divider()
//eq. air depth
HStack(alignment: .center) {
VStack(alignment: .leading) {
Text("eq. air depth")
Text("EAD")
}
Spacer()
Text(calculateEAD(o2: self.value1, po2: Float(self.PO2), measurement: unitSelection_2))
.padding(.trailing)
}
.padding(.horizontal)
Divider()
//no deco time
HStack(alignment: .center) {
VStack(alignment: .leading) {
Text("no deco time")
Text("DECO 2000")
}
Spacer()
Text("\(calculateDeco2000(o2: self.O2, po2: Float(self.PO2), measurement: unitSelection_2), specifier: "%.0f")'")
.padding(.trailing)
}
.padding(.horizontal)
Divider()
//max. dive time
HStack(alignment: .center) {
VStack(alignment: .leading) {
Text("max. dive time")
Text("CNS")
}
Spacer()
Text("\(calculateCNS(o2: self.O2, po2: Float(self.PO2), measurement: unitSelection_2), specifier: "%.0f")'")
.padding(.trailing)
}
.padding(.horizontal).padding(.bottom)
}
.padding()
}
}
struct SliderOne: View {
@ObservedObject var sliderBindingManager = SliderBindingManager(value: 32)
@Binding var value1: Int
var body: some View {
Slider(value: $sliderBindingManager.value, in: 21...90, step: 1)
.onChange(of: sliderBindingManager.value) {
if $0 > 50 {
sliderBindingManager.value = ($0 / 10).rounded(.toNearestOrEven) * 10
}
value1 = Int(sliderBindingManager.value)
}
Text("\(value1)% O2")
}
}
struct SliderFour: View {
@ObservedObject var sliderBindingManager = SliderBindingManager(value: 1.2)
@Binding var value2: Double
var body: some View {
Slider(value: $sliderBindingManager.value, in: 1.2...1.6, step: 0.1)
.onChange(of: sliderBindingManager.value) {
if $0 > 50 {
sliderBindingManager.value = ($0 / 10).rounded(.toNearestOrEven) * 10
}
value2 = Double(sliderBindingManager.value)
}
Text("\(value2, specifier: "%.1f")bar PO2")
}
}
class SliderBindingManager: ObservableObject {
@Published var value: Double
init(value: Double) { self.value = value }
}