Ios 如何在3个阶段处理滑块?

Ios 如何在3个阶段处理滑块?,ios,swift,uislider,Ios,Swift,Uislider,我在iOS应用程序中有一个UISlider对象,用以下代码初始化 滑翔器=滑翔器() 基本功能正常,但我需要清楚地分别处理这三个事件: 用户开始移动滑块时的事件 用户移动滑块时发生的事件 用户停止移动滑块时的事件 目前我使用以下代码: theSlider.addTarget(self, action: #selector(sliderHandle(_:)), for: .valueChanged) 可以处理第二个事件。 但是对于第一个和第三个,我想

我在iOS应用程序中有一个UISlider对象,用以下代码初始化

滑翔器=滑翔器()

基本功能正常,但我需要清楚地分别处理这三个事件:

  • 用户开始移动滑块时的事件
  • 用户移动滑块时发生的事件
  • 用户停止移动滑块时的事件
目前我使用以下代码:

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()