ios - 用swift 3摇动手势

标签 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.
}

最佳答案

核心运动有很多选择。您可以使用摇动事件等高级事件,也可以获取陀螺仪或加速度计更新。

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

关于ios - 用swift 3摇动手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40984314/

相关文章:

ios - Realm, Swift, 多对多关系

ios - 我如何在 ios swift 3.0 中禁用 ytplayer 中的 youtube Logo

cocoa - CMP 计步器未运行

Swift watchOS 2 - CMSensorDataList

ios - 关于转义 URL 参数中的特殊字符的困惑

ios - 如何使用 Swift 在单个 UIViewController 中实现多个 UITableView?

ios - Swift:Downcast 导致应用程序崩溃,为什么?

ios - 相对于世界的 DeviceMotion - multiplyByInverseOfAttitude

ios - 如何使用 MFMailComposeViewController 在电子邮件正文中添加图像

c# - 使用 DecelerationEnded 会干扰其他回调