我有一条线(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?如果使用重力值,我如何使用它?
非常感谢您的帮助。
1条答案
按热度按时间vlf7wbxs1#
根据您要达到的效果,您可能希望从
motion.attitude.pitch
获得俯仰角。然后,您需要根据您希望直线相对于俯仰角移动的距离来计算y偏移。假设您希望当设备在-90º和90º之间倾斜时,直线向上或向下移动100点。
你的Angular :
所以现在计算距离:
其中
maxDistance
是您希望直线移动的最远距离。您可能需要进行一些额外的检查,以确保pitch
保持在-90和90之间。比使用
CMMotionManager
更简单的方法是使用UIInterpolatingMotionEffect
。首先将行设置在其父视图的中心。然后使用以下代码:其中
maxDistance
是设备倾斜时直线移动的最大距离。在您的情况下,这听起来应该是直线父视图高度的一半。