Это распространенное решение: как определить конец перетаскивания UISlider?
Ниже приведен мой простой пример:
Код: Выделить всё
import UIKit
import SnapKit
class ViewController: UIViewController {
let label = UILabel()
let slider = UISlider()
override func viewDidLoad() {
super.viewDidLoad()
let stackView = UIStackView(arrangedSubviews: [label, slider])
stackView.axis = .vertical
stackView.spacing = 20
view.addSubview(stackView)
stackView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.horizontalEdges.equalToSuperview().inset(30)
}
label.textAlignment = .center
slider.isContinuous = true
slider.minimumValue = 0
slider.maximumValue = 100
slider.addTarget(self, action: #selector(sliderValueChanged(sender:event:)), for: .valueChanged)
}
@objc func sliderValueChanged(sender: UISlider, event: UIEvent) {
print("Slider: \(slider.value), \(event)")
label.text = "Value: \(sender.value)"
switch event.allTouches?.first?.phase {
case .began:
print("began")
case .moved:
print("moved")
case .ended:
print("ended")
case .cancelled:
print("cancelled")
default:
break
}
}
}

Поэтому в iOS 26 event.allTouches всегда равен нулю. Поэтому я не могу понять, на какой стадии события это происходит.
Это ошибка? Как это обойти?
Я обнаружил, что если я переключусь с .valueChanged на .allEvents, то получу событие для фазы начала и перемещения. Однако я не получаю завершенную или отмененную фазу.
Как я могу получить и эти фазы?
РЕДАКТИРОВАТЬ:
Похоже, это может быть ошибка:
https://developer.apple.com/forums/thre ... login=true
Подробнее здесь: https://stackoverflow.com/questions/797 ... s-always-n
Мобильная версия