swift 如何在y轴上绘制向前/向后倾斜?

h5qlskok  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(142)

我有一条线(UIView的宽度=屏幕宽度,高度= 2),我需要通过向前倾斜和向后倾斜在屏幕上上下移动这条线。我知道我需要使用陀螺仪,如何使用MotionManager()实现这一点?

var motionManager = CMMotionManager()
private func getGyroUpdates() {
    if motionManager.isDeviceMotionAvailable == true {
        motionManager.deviceMotionUpdateInterval = 0.1
        let queue = OperationQueue()
        motionManager.startDeviceMotionUpdates(to: queue, withHandler: { [weak self] motion, error in
            // Get the attitude of the device
            guard let motion = motion else { return }
            
            let pitch = Double(round(motion.attitude.pitch.rad2deg()))                
            let length = sqrt(motion.gravity.x * motion.gravity.x + motion.gravity.y * motion.gravity.y + motion.gravity.z * motion.gravity.z)
            // how to i get the value to be plotted in Y? do i use gravity? or pitch ?
                                            
            DispatchQueue.main.async {
               // frontBackMovement is the line view here
                self?.frontBackMovement.transform = CGAffineTransform(translationX: 0, y: "what should be the value here??")
            }
        })
        print("Device motion started")
    }else {
        print("Device motion unavailable")
    }
}

线需要在uiview帧中移动,我需要获得值,将其放置在Y的位置,并将其放入CGAffineTransform中。因此,基本上,我如何Map从Motion对象获得的值,以将其绘制在Y中。我尝试了从attitude.pitch获得的弧度值,但如何将其转换为Y?如果使用重力值,我如何使用它?
非常感谢您的帮助。

vlf7wbxs

vlf7wbxs1#

根据您要达到的效果,您可能希望从motion.attitude.pitch获得俯仰角。然后,您需要根据您希望直线相对于俯仰角移动的距离来计算y偏移。
假设您希望当设备在-90º和90º之间倾斜时,直线向上或向下移动100点。
你的Angular :

let pitch = Double(round(motion.attitude.pitch.rad2deg()))

所以现在计算距离:

let maxDistance = 100.0
let currentDistance = pitch / 90.0 * maxDistance

其中maxDistance是您希望直线移动的最远距离。您可能需要进行一些额外的检查,以确保pitch保持在-90和90之间。
比使用CMMotionManager更简单的方法是使用UIInterpolatingMotionEffect。首先将行设置在其父视图的中心。然后使用以下代码:

let maxDistance: Float = 100 // how far do you want the line to move
let eff = UIInterpolatingMotionEffect(keyPath: "center.y", type: .tiltAlongVerticalAxis)
eff.maximumRelativeValue = maxDistance
eff.minimumRelativeValue = -maxDistance
lineView.addMotionEffect(eff)

其中maxDistance是设备倾斜时直线移动的最大距离。在您的情况下,这听起来应该是直线父视图高度的一半。

相关问题