57 lines
1.7 KiB
Swift
57 lines
1.7 KiB
Swift
import SwiftUI
|
||
import UIKit
|
||
|
||
// 1. 自定义UIKit滑块(支持调整高度)
|
||
class ThickSlider: UISlider {
|
||
var trackHeight: CGFloat = 40 // 滑块轨道高度(可调整)
|
||
|
||
override func trackRect(forBounds bounds: CGRect) -> CGRect {
|
||
// 调整轨道框架,设置自定义高度
|
||
let original = super.trackRect(forBounds: bounds)
|
||
return CGRect(x: original.origin.x,
|
||
y: (bounds.height - trackHeight) / 2,
|
||
width: original.width,
|
||
height: trackHeight)
|
||
}
|
||
}
|
||
|
||
// 2. SwiftUI包装器
|
||
struct CustomSlider: UIViewRepresentable {
|
||
@Binding var value: Double
|
||
var trackHeight: CGFloat
|
||
var tintColor: Color
|
||
|
||
func makeUIView(context: Context) -> ThickSlider {
|
||
let slider = ThickSlider()
|
||
slider.trackHeight = trackHeight
|
||
slider.minimumValue = 0
|
||
slider.maximumValue = 1
|
||
slider.value = Float(value)
|
||
slider.addTarget(context.coordinator, action: #selector(Coordinator.valueChanged(_:)), for: .valueChanged)
|
||
slider.tintColor = UIColor(tintColor)
|
||
return slider
|
||
}
|
||
|
||
func updateUIView(_ uiView: ThickSlider, context: Context) {
|
||
uiView.value = Float(value)
|
||
uiView.trackHeight = trackHeight
|
||
uiView.tintColor = UIColor(tintColor)
|
||
}
|
||
|
||
func makeCoordinator() -> Coordinator {
|
||
Coordinator(value: $value)
|
||
}
|
||
|
||
class Coordinator: NSObject {
|
||
@Binding var value: Double
|
||
|
||
init(value: Binding<Double>) {
|
||
_value = value
|
||
}
|
||
|
||
@objc func valueChanged(_ sender: UISlider) {
|
||
value = Double(sender.value)
|
||
}
|
||
}
|
||
}
|