在一个尺寸上确定设备方向及其产生的角度?

con*_*ile 10 iphone objective-c ios gyroscope swift

我有以下设置:

在此输入图像描述

iPhone将显示器放在桌子上的天花板上(alpha = 0度).当iPhone向上移动时,如上图所示,alpha角度增加.

如何在不考虑可能发生变化的其他轴的情况下计算α角的值.我只对这一轴感兴趣.

如何从桌子上抬起iPhone时获得正确的alpha角度?当alpha的值发生变化时,如何收到通知?

Ste*_*ord 12

您可以使用CMMotionManager该类来监视设备运动更改.

目标C.

// Ensure to keep a strong reference to the motion manager otherwise you won't get updates
self.motionManager = [[CMMotionManager alloc] init];
if (self.motionManager.deviceMotionAvailable) {

    self.motionManager.deviceMotionUpdateInterval = 0.1;

    // For use in the montionManager's handler to prevent strong reference cycle
    __weak typeof(self) weakSelf = self;

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [self.motionManager startDeviceMotionUpdatesToQueue:queue
                                            withHandler:^(CMDeviceMotion *motion, NSError *error) {

                                                // Get the attitude of the device
                                                CMAttitude *attitude = motion.attitude;

                                                // Get the pitch (in radians) and convert to degrees.                                          
                                                NSLog(@"%f", attitude.pitch * 180.0/M_PI);

                                                dispatch_async(dispatch_get_main_queue(), ^{
                                                    // Update some UI
                                                });

                                            }];

    NSLog(@"Device motion started");
}
else {
    NSLog(@"Device motion unavailable");
}
Run Code Online (Sandbox Code Playgroud)

迅速

// Ensure to keep a strong reference to the motion manager otherwise you won't get updates
motionManager = CMMotionManager()
if motionManager?.deviceMotionAvailable == true {

    motionManager?.deviceMotionUpdateInterval = 0.1;

    let queue = NSOperationQueue()
    motionManager?.startDeviceMotionUpdatesToQueue(queue, withHandler: { [weak self] (motion, error) -> Void in

        // Get the attitude of the device
        if let attitude = motion?.attitude {
            // Get the pitch (in radians) and convert to degrees.
            // Import Darwin to get M_PI in Swift
            print(attitude.pitch * 180.0/M_PI)

            dispatch_async(dispatch_get_main_queue()) {
                // Update some UI
            }
        }

    })

    print("Device motion started")
}
else {
    print("Device motion unavailable");
}
Run Code Online (Sandbox Code Playgroud)

NSHipster(一如既往)是一个很好的信息来源,关于CMDeviceMotion的文章也不例外.


Aar*_*sen 5

斯威夫特4:

  let motionManager = CMMotionManager()

   if motionManager.isDeviceMotionAvailable {

       motionManager.deviceMotionUpdateInterval = 0.1

       motionManager.startDeviceMotionUpdates(to: OperationQueue()) { [weak self] (motion, error) -> Void in

           if let attitude = motion?.attitude {

                print(attitude.pitch * 180 / Double.pi)

                DispatchQueue.main.async{
                    // Update UI
               }
           }

       }

       print("Device motion started")
    }
   else {
       print("Device motion unavailable")
    }
Run Code Online (Sandbox Code Playgroud)