如何在Swift中检测屏幕滑动的速度与角度并存储为数值类型
当然可以做到!在iOS开发里,用Swift实现滑动角度和速度的捕获、存储完全没问题,咱们直接用系统的UIPanGestureRecognizer就能搞定,而且结果可以轻松存成Double或Float类型。下面一步步给你讲清楚:
核心实现逻辑
- 捕获滑动手势:给需要检测滑动的视图(比如整个屏幕的view)添加
UIPanGestureRecognizer,监听手势的状态变化。 - 计算滑动角度:通过手势的
translation(in:)方法获取滑动的位移向量,再利用三角函数atan2计算出角度(记得把弧度转成常用的角度值)。 - 计算滑动速度:手势自带
velocity(in:)方法,能直接拿到滑动的x、y方向速度,用勾股定理就能算出合速度的大小。
完整代码示例
import UIKit class SwipeDetectionViewController: UIViewController { // 存储滑动角度和速度的变量,这里用Double类型,换成Float也完全可行 var swipeAngle: Double = 0.0 var swipeSpeed: Double = 0.0 override func viewDidLoad() { super.viewDidLoad() setupPanGesture() } private func setupPanGesture() { // 创建平移手势识别器,并绑定处理方法 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleSwipe(_:))) // 可以根据需求设置手势的最小滑动距离等参数 panGesture.minimumNumberOfTouches = 1 view.addGestureRecognizer(panGesture) } @objc private func handleSwipe(_ gesture: UIPanGestureRecognizer) { // 在手势变化或结束时计算数据 guard gesture.state == .changed || gesture.state == .ended else { return } // 获取滑动的位移(相对于当前视图的坐标) let translation = gesture.translation(in: view) // 获取滑动的速度向量(单位:points/秒) let velocity = gesture.velocity(in: view) // 计算角度:atan2(y, x)得到弧度,转成角度(范围:-180° 到 180°) swipeAngle = Double(atan2(translation.y, translation.x)) * 180 / .pi // 计算合速度的大小:用勾股定理计算x、y方向速度的合值 swipeSpeed = Double(sqrt(pow(velocity.x, 2) + pow(velocity.y, 2))) // 这里可以根据业务需求使用存储的角度和速度,比如更新UI或者上传数据 print("当前滑动角度:\(String(format: "%.2f", swipeAngle))°,滑动速度:\(String(format: "%.2f", swipeSpeed)) points/sec") } }
额外注意点
- 角度范围调整:默认计算出的角度是
-180°到180°,如果需要0°到360°的范围,可以加个判断:如果角度为负,就加上360。 - 速度单位:
velocity(in:)返回的速度单位是points/秒,和iOS的坐标系统一致,直接用就可以。 - 变量类型转换:如果需要用
Float类型存储,只需要把Double换成Float,计算时做相应的类型转换即可(比如Float(atan2(...)))。
内容的提问来源于stack exchange,提问作者Jia Chen
相关产品推荐
相关产品推荐

