用快速3摇动手势

时间:2016-12-05 22:14:26

标签: ios swift core-motion

我试图在一个盒子的左侧和右侧击球,速度取决于摇动手势的速度/加速度。 我无法得到这个我尝试了很多东西,但我无法获得手势的速度/加速度。我使用核心动作以及motionBegunmotionEnded方法检测到手势,但无法检测到速度,因此我可以创建一个在盒子两侧击球的逻辑。 这是我的代码,我如何使用CoreMotion检测摇动的方向,并使用motionBegunmotionEnded

摇动手势检测
var startedLeftTilt = false
var startedRightTilt = false
var dateLastShake = NSDate(timeIntervalSinceNow: -2)
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2)
var motionManager = CoreMotion.CMMotionManager()
let tresholdFirstMove = 3.0
let tresholdBackMove = 0.5



override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    motionManager.startGyroUpdates(to: OperationQueue.current!, withHandler: { (gyroData, error) -> Void in
        self.handleGyroData(rotation: (gyroData?.rotationRate)!)
    })

}

private func handleGyroData(rotation: CMRotationRate) {

    if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3
    {
        if !startedRightTilt && !startedLeftTilt
        {
            dateStartedTilt = NSDate()
            if (rotation.z > 0)
            {
                startedLeftTilt = true
                startedRightTilt = false
            }
            else
            {
                startedRightTilt = true
                startedLeftTilt = false
            }
        }
    }

    if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3
    {
        startedRightTilt = false
        startedLeftTilt = false
    }
    else
    {
        if (fabs(rotation.z) > tresholdBackMove)
        {
            if startedLeftTilt && rotation.z < 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false


            }
            else if startedRightTilt && rotation.z > 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false


            }
        }
    }

}

override func becomeFirstResponder() -> Bool {
    return true
}
override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        NSLog("Motion is Started");
    }
}
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        NSLog("Motion is Ended");
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    motionManager.gyroUpdateInterval = 0.01
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

2 个答案:

答案 0 :(得分:1)

核心动作有很多选择。您可以使用高级别事件,如摇晃事件,或者您可以获得陀螺仪或更新仪表。

您发布的代码是监控陀螺事件。如果你正在寻找震动的力量,你需要acellerometer事件,而不是陀螺事件。

答案 1 :(得分:1)

同时使用gyromotion来获取触发器。陀螺仪将为您提供方向和动作,为您提供某种速度分析。 使用您的自定义逻辑同时实现两者将是您想要获得的确切内容。 使用最后一个答案来查找方向。 StackAnswer