How customise Slider blue line in SwiftUI?

后端 未结 4 1191
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-05 03:31

Like in UISlider

let slider = UISlider()

slider.minimumTrackTintColor = .red
4条回答
  •  失恋的感觉
    2021-01-05 03:52

    As pointed out in other answers you have limited ability to customize a Slider in SwiftUI. You can change the .accentColor(.red) but that only changes the minimumTrackTintColor.

    Example of a Slider with .accentColor(.red)

    Additionally, you can't change other things like thumbTintColor. If you want more customization than just minimumTrackTintColor that you have no choice but to use a UISlider in SwiftUI as rob mayoff stated.

    Here is some code on how you can use a UISlider in SwiftUI

    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
    
        // Create the binding when you initialize the Coordinator
        init(value: Binding) {
          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)
      }
    }
    
    #if DEBUG
    struct SwiftUISlider_Previews: PreviewProvider {
      static var previews: some View {
        SwiftUISlider(
          thumbColor: .white,
          minTrackColor: .blue,
          maxTrackColor: .green,
          value: .constant(0.5)
        )
      }
    }
    #endif
    

    Then you can use this slider in your ContentView like this:

    struct ContentView: View {
      @State var sliderValue: Double = 0.5
    
      var body: some View {
        VStack {
          Text("SliderValue: \(sliderValue)")
          // Slider(value: $sliderValue).accentColor(.red).padding(.horizontal)
    
          SwiftUISlider(
            thumbColor: .green,
            minTrackColor: .red,
            maxTrackColor: .blue,
            value: $sliderValue
          ).padding(.horizontal)
        }
      }
    }
    

    Example:

    Link to full project

提交回复
热议问题