Home > OS >  Add closure in UISlider: UIViewRepresentable
Add closure in UISlider: UIViewRepresentable

Time:01-31

I use uislider UIViewRepresentable,but i need the closure onEditingChanged in swiftui like Slider(value: $value, in: 0...1, step: 0.01, onEditingChanged: { data in code })

how can i add the function in UIViewRepresentable.

struct SwiftUISlider: UIViewRepresentable {

  final class Coordinator: NSObject {
    // The class property value is a binding: It’s a reference to the SwiftUISlider
    // value, which receives a reference to a @State variable value in ContentView.
    var value: Binding<Double>

    // Create the binding when you initialize the Coordinator
    init(value: Binding<Double>) {
      self.value = value
    }

    // Create a valueChanged(_:) action
    @objc func valueChanged(_ sender: UISlider) {
      self.value.wrappedValue = Double(sender.value)
    }
  }

  var thumbColor: UIColor = .white
  var minTrackColor: UIColor?
  var maxTrackColor: UIColor?

  @Binding var value: Double

  func makeUIView(context: Context) -> UISlider {
    let slider = UISlider(frame: .zero)
    slider.thumbTintColor = thumbColor
    slider.minimumTrackTintColor = minTrackColor
    slider.maximumTrackTintColor = maxTrackColor
    
    slider.value = Float(value)

    slider.addTarget(
      context.coordinator,
      action: #selector(Coordinator.valueChanged(_:)),
      for: .valueChanged
    )

    return slider
  }

  func updateUIView(_ uiView: UISlider, context: Context) {
    // Coordinating data between UIView and SwiftUI view
    uiView.value = Float(self.value)
  }

  func makeCoordinator() -> SwiftUISlider.Coordinator {
    Coordinator(value: $value)
  }
}

CodePudding user response:

Try this:

struct SwiftUISlider: UIViewRepresentable {
    var onValueChanged: ((Double) -> Void)?
    final class Coordinator: NSObject {
        // The class property value is a binding: It’s a reference to the SwiftUISlider
        // value, which receives a reference to a @State variable value in ContentView.
        var value: Binding<Double>
        var onValueChanged: ((Double) -> Void)?
        // Create the binding when you initialize the Coordinator
        init(value: Binding<Double>, onValueChanged: ((Double) -> Void)? = nil) {
            self.value = value
            self.onValueChanged = onValueChanged
        }
        // Create a valueChanged(_:) action
        @objc func valueChanged(_ sender: UISlider) {
            self.value.wrappedValue = Double(sender.value)
            guard let onValueChanged = onValueChanged else {
                return
            }
            onValueChanged(Double(sender.value))
        }
    }
    var thumbColor: UIColor = .white
    var minTrackColor: UIColor?
    var maxTrackColor: UIColor?
    @Binding var value: Double
    func makeUIView(context: Context) -> UISlider {
        let slider = UISlider(frame: .zero)
        slider.thumbTintColor = thumbColor
        slider.minimumTrackTintColor = minTrackColor
        slider.maximumTrackTintColor = maxTrackColor
        slider.value = Float(value) 
        slider.addTarget(
            context.coordinator,
            action: #selector(Coordinator.valueChanged(_:)),
            for: .valueChanged
        )
        return slider
    }
    func updateUIView(_ uiView: UISlider, context: Context) {
        // Coordinating data between UIView and SwiftUI view
        uiView.value = Float(self.value)
    } 
    func makeCoordinator() -> SwiftUISlider.Coordinator {
        .init(value: $value, onValueChanged: onValueChanged)
    }
}

extension SwiftUISlider {
    func onValueChange(action: @escaping (Double) -> Void) -> SwiftUISlider {
        .init(onValueChanged: action, thumbColor: thumbColor, minTrackColor: minTrackColor, maxTrackColor: maxTrackColor, value: $value)
    }
}
  •  Tags:  
  • Related