iOS手势滑块拖拽实现

iOS 手势滑块的实现,真的是蛮常见但又不太好写对的需求。是在音乐播放器、音量调节这些地方,用手指拖来拖去的体验,比传统点击按钮直观多了。核心是用UIPanGestureRecognizer,就是那个拖动手势。你只要把它加在你的UISlider上,拖拽的行为就能监听到了,响应也快,代码也简单。

创建手势的方式直接:

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
slider.addGestureRecognizer(panGesture)

你只需要定义一个handlePanGesture(_:)方法,在里面拿到手势的位置,转成滑块的值,再更新一下就好:

@objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) {
  guard let slider = gestureRecognizer.view as? UISlider else { return }
  let translation = gestureRecognizer.translation(in: slider)
  var newValue = slider.value + Float(translation.x / slider.frame.width)
  if newValue < slider xss=removed> slider.maximumValue { newValue = slider.maximumValue }
  slider.setValue(newValue, animated: true)
  gestureRecognizer.setTranslation(.zero, in: slider)
}

不过如果你不滑块弹回去,而是停在你放手那一刻的位置,可以改一下动画方式:

UIView.animate(withDuration: 0.3) {
  slider.setValue(newValue, animated: false)
}

这里还可以根据gestureRecognizer.state来判断是开始拖动、结束拖动,还是取消,交互逻辑就能更灵活些。想进阶的话,可以看看“DragTrain”文件,里面有完整代码,思路也清晰。

如果你对手势识别还不熟,可以看看这篇挺不错的:iOS 手势识别:UIGestureRecognizer 子类详解,入门快。

调试这类交互最好上真机,模拟器拖动手感还是差点意思。

zip 文件大小:163.87KB