Ios 如何在3个阶段处理滑块?
我在iOS应用程序中有一个UISlider对象,用以下代码初始化 滑翔器=滑翔器() 基本功能正常,但我需要清楚地分别处理这三个事件:Ios 如何在3个阶段处理滑块?,ios,swift,uislider,Ios,Swift,Uislider,我在iOS应用程序中有一个UISlider对象,用以下代码初始化 滑翔器=滑翔器() 基本功能正常,但我需要清楚地分别处理这三个事件: 用户开始移动滑块时的事件 用户移动滑块时发生的事件 用户停止移动滑块时的事件 目前我使用以下代码: theSlider.addTarget(self, action: #selector(sliderHandle(_:)), for: .valueChanged) 可以处理第二个事件。 但是对于第一个和第三个,我想
- 用户开始移动滑块时的事件
- 用户移动滑块时发生的事件
- 用户停止移动滑块时的事件
theSlider.addTarget(self, action: #selector(sliderHandle(_:)),
for: .valueChanged)
可以处理第二个事件。
但是对于第一个和第三个,我想我需要在不确定的情况下将UISlider子类化。欢迎提供任何提示。作为一般说明,请务必查看类层次结构,例如小部件的超类,以查看从它们继承的小部件还可以使用哪些其他方法
您不一定需要对UISlider
进行子类化,但是如果您认为可重用性是值得的,您可能希望对其进行子类化,或者根据您正在做的事情,UIControl
UISlider
是UIControl
的子类,它是UIView
的子类。
UIControl
是一个“widgetized”UIView
,换句话说,它提供的方法主要有助于检测用户输入,并支持发送事件,这些功能对于任何UI控件小部件来说都是通用的
对于移动和位置检测,UIControl
类具有方法beginTracking()
,continueTracking()
,endTracking()
,cancelTracking()
,isTracking()
,isTouchInside()
。这些可直接从UISlider
对象获得
类似地,您可以通过UIControl
公开的sendAction()
和sendActions()
显式触发动作(事件),从而对UISlider
隐式可用
如果您不需要子类化,您可以编写一段“一次性”(例如特定于应用程序)的代码,直接通过UISlider
实例使用上述方法,直接跟踪小部件的“触碰”,并在滑动路径的关键位置传递事件,或者使用您检测到的特定行为
请参见此问题,了解实施思路
Apple's有一个子类注释部分,解释如何使用目标操作机制。作为一般说明,请务必查看类层次结构,例如小部件的超类,以查看从它们继承的小部件还可以使用哪些其他方法
您不一定需要对UISlider
进行子类化,但是如果您认为可重用性是值得的,您可能希望对其进行子类化,或者根据您正在做的事情,UIControl
UISlider
是UIControl
的子类,它是UIView
的子类。
UIControl
是一个“widgetized”UIView
,换句话说,它提供的方法主要有助于检测用户输入,并支持发送事件,这些功能对于任何UI控件小部件来说都是通用的
对于移动和位置检测,UIControl
类具有方法beginTracking()
,continueTracking()
,endTracking()
,cancelTracking()
,isTracking()
,isTouchInside()
。这些可直接从UISlider
对象获得
类似地,您可以通过UIControl
公开的sendAction()
和sendActions()
显式触发动作(事件),从而对UISlider
隐式可用
如果您不需要子类化,您可以编写一段“一次性”(例如特定于应用程序)的代码,直接通过UISlider
实例使用上述方法,直接跟踪小部件的“触碰”,并在滑动路径的关键位置传递事件,或者使用您检测到的特定行为
请参见此问题,了解实施思路
Apple's有一个子类注释部分,解释如何使用目标操作机制。UIControl.Event有许多其他值,除了
。valueChanged
。触地
可以告诉您用户何时开始与滑块和滑块对进行交互。触摸内部和。触摸外部
可以告诉您用户何时完成拖动。以下是一个游乐场示例:
import SwiftUI
import PlaygroundSupport
class V: UIViewController {
let slider = UISlider(frame: .init(origin: .zero, size: .init(width: 200, height: 50)))
override func viewDidLoad() {
super.viewDidLoad()
slider.minimumValue = 0
slider.maximumValue = 100
slider.value = 50
slider.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(slider)
slider.addTarget(self, action: #selector(changed), for: .valueChanged)
slider.addTarget(self, action: #selector(began), for: .touchDown)
slider.addTarget(self, action: #selector(ended), for: .touchUpInside)
slider.addTarget(self, action: #selector(ended), for: .touchUpOutside)
}
@objc private func changed(sender: UISlider) {
print("Changed")
}
@objc private func began(sender: UISlider) {
print("Began")
}
@objc private func ended(sender: UISlider) {
print("Ended")
}
}
PlaygroundPage.current.liveView = V()
UIControl.事件除了<代码>之外还有许多其他值。值已更改
。触地
可以告诉您用户何时开始与滑块和滑块对进行交互。触摸内部和。触摸外部
可以告诉您用户何时完成拖动。以下是一个游乐场示例:
import SwiftUI
import PlaygroundSupport
class V: UIViewController {
let slider = UISlider(frame: .init(origin: .zero, size: .init(width: 200, height: 50)))
override func viewDidLoad() {
super.viewDidLoad()
slider.minimumValue = 0
slider.maximumValue = 100
slider.value = 50
slider.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(slider)
slider.addTarget(self, action: #selector(changed), for: .valueChanged)
slider.addTarget(self, action: #selector(began), for: .touchDown)
slider.addTarget(self, action: #selector(ended), for: .touchUpInside)
slider.addTarget(self, action: #selector(ended), for: .touchUpOutside)
}
@objc private func changed(sender: UISlider) {
print("Changed")
}
@objc private func began(sender: UISlider) {
print("Began")
}
@objc private func ended(sender: UISlider) {
print("Ended")
}
}
PlaygroundPage.current.liveView = V()