我如何扩展 UISlider 以便它使用回调来检测滑块值何时发生变化?
How can I extend UISlider so that it uses a callback which detects when the slider value has changed?
我想为 UISlider 创建一个扩展,它允许我在滑块值更改时使用回调来执行操作。换句话说,它与使用 UIControl.Event.valueChanged 添加动作具有相同的效果。
所以不要添加这样的操作:
let mySlider = UISlider()
mySlider.addTarget(self, action: #selector(sliderDidChangeValue(_:)), for: .valueChanged)
@objc func sliderDidChangeValue(_ sender: UISlider) {
print(sender.value)
}
我想创建一个这样的扩展,但回调的行为与上述操作相同:
extension UISlider {
convenience init(value: Float = 0,
range: ClosedRange<Float> = 0 ... 1,
callback: @escaping (_ x: Float) -> Void = { _ in}) {
self.init()
self.value = value
self.minimumValue = range.lowerBound
self.maximumValue = range.upperBound
}
}
let mySlider = UISlider(value: 10, range: 1...10) { (newValue) in
print(newValue)
}
在我看来应该可以实现,但我真的不知道该怎么做。在此先感谢您的帮助。
如果要将闭包作为目标添加到 UISlider
,则必须使用扩展将函数添加到 UISlider
。
@objc class SliderClass: NSObject {
let closure: (_ val:Float)->()
init (_ closure: @escaping (_ val:Float)->()) {
self.closure = closure
}
@objc func sliderValueChange(sender:UISlider) {
closure(sender.value)
}
}
extension UISlider {
func addAction(for controlEvents: UIControl.Event = .valueChanged, value : Float = 1, range : ClosedRange<Float> = 0 ... 1, _ closure: @escaping (_ val:Float)->()) {
self.minimumValue = range.lowerBound
self.maximumValue = range.upperBound
self.value = value
let classObj = SliderClass(closure)
addTarget(classObj, action: #selector(SliderClass.sliderValueChange), for: controlEvents)
objc_setAssociatedObject(self, "", classObj, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
在您的class
中使用
slider.addAction(value:1.9,range: 0 ... 2) { (newValue) in
print(String(format: "%.2f", newValue))
}
或
slider.addAction(value:1.5, range: 0 ... 2) {
print(String(format: "%.2f", [=12=]))
}
我想为 UISlider 创建一个扩展,它允许我在滑块值更改时使用回调来执行操作。换句话说,它与使用 UIControl.Event.valueChanged 添加动作具有相同的效果。
所以不要添加这样的操作:
let mySlider = UISlider()
mySlider.addTarget(self, action: #selector(sliderDidChangeValue(_:)), for: .valueChanged)
@objc func sliderDidChangeValue(_ sender: UISlider) {
print(sender.value)
}
我想创建一个这样的扩展,但回调的行为与上述操作相同:
extension UISlider {
convenience init(value: Float = 0,
range: ClosedRange<Float> = 0 ... 1,
callback: @escaping (_ x: Float) -> Void = { _ in}) {
self.init()
self.value = value
self.minimumValue = range.lowerBound
self.maximumValue = range.upperBound
}
}
let mySlider = UISlider(value: 10, range: 1...10) { (newValue) in
print(newValue)
}
在我看来应该可以实现,但我真的不知道该怎么做。在此先感谢您的帮助。
如果要将闭包作为目标添加到 UISlider
,则必须使用扩展将函数添加到 UISlider
。
@objc class SliderClass: NSObject {
let closure: (_ val:Float)->()
init (_ closure: @escaping (_ val:Float)->()) {
self.closure = closure
}
@objc func sliderValueChange(sender:UISlider) {
closure(sender.value)
}
}
extension UISlider {
func addAction(for controlEvents: UIControl.Event = .valueChanged, value : Float = 1, range : ClosedRange<Float> = 0 ... 1, _ closure: @escaping (_ val:Float)->()) {
self.minimumValue = range.lowerBound
self.maximumValue = range.upperBound
self.value = value
let classObj = SliderClass(closure)
addTarget(classObj, action: #selector(SliderClass.sliderValueChange), for: controlEvents)
objc_setAssociatedObject(self, "", classObj, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
在您的class
中使用slider.addAction(value:1.9,range: 0 ... 2) { (newValue) in
print(String(format: "%.2f", newValue))
}
或
slider.addAction(value:1.5, range: 0 ... 2) {
print(String(format: "%.2f", [=12=]))
}